├── old ├── vtex-smartResearch.V.2.3.js ├── vtex-smartResearch.V.2.4.js ├── vtex-smartResearch.V.2.5.js ├── vtex-smartResearch.V.3.0.js ├── vtex-smartResearch.V.3.1.js ├── vtex-smartResearch.V.3.3.js ├── vtex-smartResearch.V.3.2.js ├── vtex-smartResearch.V.3.4.js ├── vtex-smartResearch.V.3.5.js ├── vtex-smartResearch.V.3.6.js ├── vtex-smartResearch.V.3.7.js └── vtex-smartResearch.V.3.8.js ├── example └── example.js ├── vtex-smartResearch.css ├── README.md ├── vtex-smartResearch.min.js ├── vtex-smartResearch.js └── vtex-smartResearch.dev.js /old/vtex-smartResearch.V.2.3.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cvscarlos/VTEX-Smart-Research/HEAD/old/vtex-smartResearch.V.2.3.js -------------------------------------------------------------------------------- /example/example.js: -------------------------------------------------------------------------------- 1 | $(function(){ 2 | var disclaimer=$(".disclaimer"); 3 | var halfBanner=$(".halfBanner"); 4 | 5 | $(".navLeftDepartament input[type='checkbox']").vtexSmartResearch({ 6 | loadContent:'.columnMain #search', 7 | filtersMenu:'.navLeftDepartament', 8 | searchUrl:'/buscapagina?ft=nokia&PS=5&sl=336f9b54-4681-49c2-85b5-c6524e25e92d&cc=1&sm=0&PageNumber=', 9 | usePopup:true, 10 | pageLimit:1000, 11 | ajaxCallback:function(obj) 12 | { 13 | if(obj.filters>0) 14 | { 15 | disclaimer.hide(); 16 | halfBanner.hide(); 17 | } 18 | else 19 | { 20 | disclaimer.show(); 21 | halfBanner.show(); 22 | } 23 | }, 24 | authorizeScroll:function(obj) 25 | { 26 | return (obj.filters>0)?true:false; 27 | }, 28 | authorizeUpdate:function(obj) 29 | { 30 | if(obj.filters>0) 31 | return true; 32 | else 33 | { 34 | $("#search").children().slideUp(); 35 | return false; 36 | } 37 | } 38 | }); 39 | }); -------------------------------------------------------------------------------- /vtex-smartResearch.css: -------------------------------------------------------------------------------- 1 | /* Extensão */ 2 | .vtexSr-overlay{display:none; width:100%; height:100%; left:0; position:absolute; top:0; z-index:10; background:#FFF url("/arquivos/ajax-loader.gif") center center no-repeat;} 3 | 4 | /* Controles */ 5 | .search-multiple-navigator{visibility:hidden;} 6 | 7 | /* Return to top */ 8 | #returnToTop{display:none; position:fixed; bottom:100px; right:0; width:90px; padding:3px 0 0 4px; height:32px; background-color:#FFF; border-radius:4px 0 0 4px;} 9 | #returnToTop span{font-weight:bold; height:auto; line-height:12px; color:#AD2023;} 10 | #returnToTop .text{display:block;} 11 | #returnToTop .text2{float:left; font-size:18px; font-weight:normal;} 12 | #returnToTop .arrowToTop{background:url("/arquivos/returnToTop.png") no-repeat #AD2023; width:32px; height:32px; position:absolute; top:2px; right:0; display:block; float:right;} 13 | 14 | /* SCROLL INFINITO */ 15 | #scrollLoading{border:#FFD324 solid 2px; margin:20px auto; line-height:20px; padding:5px; width:100px; background:url("/arquivos/ajax-loader2.gif") no-repeat right center #FFF6BF;} 16 | 17 | /* Chilli Beans */ 18 | .resultItemsWrapper{position:relative;} -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #VTEX - Smart Research 2 | >*Extensões da plataforma VTEX são plugins criados por desenvolvedores de interface ou pelo VTEX Lab (Laboratório de Inovações da VTEX) que podem ser inseridas em sua loja. Existem extensões gratuitas com código aberto - Open Source - e extensões pagas. Indicamos que a instalação seja realizada pelos profissionais e empresas certificados pela VTEX. Vale ressaltar que qualquer profissional de CSS, JavaScript e HTML pode também executar esta tarefa.* 3 | 4 | ---------- 5 | 6 | Veja este componente na [VTEX Store](http://conversionstore.com.br/index.php/extensoes/home/smart-research) 7 | 8 | ##Instalação 9 | Faça o upload para o "Gerenciador do portal" no "Vtex Admin" dos seguintes arquivos: 10 | * vtex-smartResearch.css 11 | * vtex-smartResearch.min.js 12 | 13 | Faça a chamada do arquivo javascript e CSS na página: 14 | 15 | ```html 16 | 17 | 18 | ``` 19 | 20 | Certifique-se que na página existe o controle `` e que os produtos possueem opções de filtros. 21 | 22 | Execute o plugin sempre selecionando os check-box retornados pelo controle: 23 | ```javascript 24 | $(".menuLateral input[type='checkbox']").vtexSmartResearch(); 25 | ``` 26 | 27 | ###Avançado 28 | 29 | Configurações completas do plugin (lista atualizada em 07/11/2012): 30 | ```javascript 31 | $(".menuLateral input[type='checkbox']").vtexSmartResearch({ 32 | pageLimit:null, // Número máximo de páginas que o script irá retornar. Exemplo "pageLimit=3" só será retornado resultados até a terceira página 33 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 34 | shelfClass:".prateleira", // Pratelira de produtos (filha do elemento definido de um "loadContent") 35 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 36 | linksMenu:".search-single-navigator", // Menu de links 37 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 38 | mergeMenu:true, // Define se o menu de links será mesclado com o de filtros será mesclado na página de departamento 39 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de links será inserido após este elemento 40 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) no qual será adicionado a mensagem de busca vazia 41 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 42 | returnTopText:'voltar aoTOPO', // Mensagem de "retornar ao topo" 43 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html com a mensagem para ser apresentada quando não existirem resultados para os filtros selecionados 44 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro exibida quando existe algum erro de servidor ao aplicar os filtros 45 | searchUrl:null, // Url da página de busca (opicional) 46 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 47 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 48 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 49 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 50 | filterScrollTop:function(shelfOffset) 51 | { 52 | return (shelfOffset.top-20); 53 | }, 54 | callback:function(){}, 55 | // Cálculo do tamanho do conteúdo/vitrine para que uma nova página seja chamada antes do usuário chegar ao "final" do site 56 | getShelfHeight:function(container) 57 | { 58 | return (container.scrollTop()+container.height()); 59 | }, 60 | // Callback após inserir a prateleira na página 61 | shelfCallback:function(){}, 62 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 63 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 64 | ajaxCallback:function(){}, 65 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 66 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 67 | emptySearchCallback:function(){}, 68 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 69 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 70 | authorizeScroll:function(){return true;}, 71 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 72 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 73 | authorizeUpdate:function(){return true;}, 74 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 75 | labelCallback:function(data){} 76 | }); 77 | ``` -------------------------------------------------------------------------------- /vtex-smartResearch.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.8 7 | * @date 2012-10-01 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var r={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E", 10 | "\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(e){return"undefined"!=typeof r[e]?r[e]:e})});"function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(r){$this=jQuery(this);var e=function(a,b){"object"==typeof console&&console.log("[Smart Research - "+(b||"Erro")+"] "+a)},B={pageLimit:null,loadContent:".prateleira[id^=ResultItems]",shelfClass:".prateleira",filtersMenu:".search-multiple-navigator",linksMenu:".search-single-navigator",menuDepartament:".navigation .menu-departamento",insertMenuAfter:".search-multiple-navigator h3:first",emptySearchElem:jQuery('
'),elemLoading:'
Carregando ...
', 12 | returnTopText:'voltar aoTOPO',emptySearchMsg:"

Esta combina\u00e7\u00e3o de filtros n\u00e3o retornou nenhum resultado!

",filterErrorMsg:"Houve um erro ao tentar filtrar a p\u00e1gina!",searchUrl:null,mergeMenu:!0,usePopup:!1,showLinks:!0,popupAutoCloseSeconds:3,filterScrollTop:function(a){return a.top-20},callback:function(){},getShelfHeight:function(a){return a.scrollTop()+a.height()},shelfCallback:function(){},ajaxCallback:function(){}, 13 | emptySearchCallback:function(){},authorizeScroll:function(){return!0},authorizeUpdate:function(){return!0},labelCallback:function(){}},b=jQuery.extend(B,r),C=jQuery(""),x=jQuery(b.elemLoading),p=2,t=!0,m=jQuery(window);jQuery(document);var y=jQuery("html,body"),j=jQuery("body"),n="",d="",u="",v=!1,h=jQuery(b.loadContent),k=jQuery(b.filtersMenu),f={requests:0,filters:0,isEmpty:!1},l={},i={getUrl:function(a){return a?n.replace(/PageNumber=[0-9]*/,"PageNumber="+p):(u+d).replace(/PageNumber=[0-9]*/,"PageNumber="+ 14 | D)},getSearchUrl:function(){var a,b,c;jQuery("script:not([src])").each(function(){b=jQuery(this)[0].innerHTML;c=/\/buscapagina\?.+&PageNumber=/i;if(-1a.length&&(a=jQuery(''),j.append(a));var g=m.height();m.bind("resize",function(){g=m.height()});m.bind("scroll",function(){m.scrollTop()>g?a.stop(!0).fadeTo(300,1,function(){a.show()}):a.stop(!0).fadeTo(300,0,function(){a.hide()})});a.bind("click",function(){y.animate({scrollTop:0},"slow");return!1})},infinitScroll:function(){var a,g,c;c=(j.find(".pager:first").attr("id")||"").split("_").pop();a=null!==b.pageLimit?b.pageLimit:window["pagecount_"+c];g=!0;"undefined"=== 16 | typeof a&&(a=99999999);m.bind("scroll",function(){var c=jQuery(this);if(!v&&p<=a&&t&&b.authorizeScroll(f)){if(c.scrollTop()+c.height()>=b.getShelfHeight(h)&&g){var d=h.find(b.shelfClass).filter(":last");d.after(x);g=!1;w=jQuery.ajax({url:i.getUrl(!0),success:function(a){1>a.trim().length?(t=!1,e("N\u00e3o existem mais resultados a partir da p\u00e1gina: "+(p-1),"Aviso")):d.after(a);g=!0;x.remove();f.requests++;b.ajaxCallback(f)}});p++}}else return!1})}},n=null!==b.searchUrl?u=b.searchUrl:u=i.getSearchUrl(); 17 | if(1>$this.length)return e("Nenhuma op\u00e7\u00e3o de filtro encontrada","Aviso"),b.showLinks&&jQuery(b.linksMenu).css("visibility","visible").show(),i.infinitScroll(),i.scrollToTop(),$this;if(1>h.length)return e("Elemento para destino da requisi\u00e7\u00e3o n\u00e3o foi encontrado \n ("+h.selector+")"),!1;1>k.length&&e("O menu de filtros n\u00e3o foi encontrado \n ("+k.selector+")");var z=jQuery(b.linksMenu),q=jQuery('
'),A=jQuery(b.menuDepartament),E=h.offset(), 18 | D=1,s=null,w=null;b.emptySearchElem.append(b.emptySearchMsg);h.before(q);var c={exec:function(){c.setFilterMenu();c.fieldsetFormat();$this.each(function(){var a=jQuery(this),b=a.parent();a.is(":checked")&&(d+="&"+(a.attr("rel")||""),b.addClass("sr_selected"));c.adjustText(a);b.append('');a.bind("change",function(){c.inputAction();a.is(":checked")?c.addFilter(a):c.removeFilter(a);f.filters=$this.filter(":checked").length})});""!==d&&c.addFilter(C)}, 19 | mergeMenu:function(){if(!b.mergeMenu)return!1;A.insertAfter(b.insertMenuAfter);c.departamentMenuFormat(A)},mergeMenuList:function(){var a=0;k.find("h3,h4").each(function(){var b=z.find("h3,h4").eq(a).next("ul");b.insertAfter(jQuery(this));c.departamentMenuFormat(b);a++})},departamentMenuFormat:function(a){a.find("a").each(function(){var a=jQuery(this);a.text(c.removeCounter(a.text()))})},fieldsetFormat:function(){l.fieldsetCount=0;l.tmpCurrentLabel={};k.find("fieldset").each(function(){var a=jQuery(this), 20 | c=a.find("label"),d="filtro_"+(a.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-");l[d]={};1>c.length?a.hide():(a.addClass(d),c.each(function(c){var g=jQuery(this),e=g.find("input").val()||"",f="sr_"+e.toLowerCase().replaceSpecialChars().replace(/\s/g,"-");l.tmpCurrentLabel={fieldsetParent:[a,d],elem:g};l[d][c.toString()]={className:f,title:e};g.addClass(f).attr({title:e,index:c});b.labelCallback(l)}),l.fieldsetCount++)})},inputAction:function(){null!==w&&w.abort(); 21 | null!==s&&s.abort();p=2;t=!0},addFilter:function(a){d+="&"+(a.attr("rel")||"");q.fadeTo(300,0.6);n=i.getUrl();s=jQuery.ajax({url:n,success:c.filterAjaxSuccess,error:c.filterAjaxError});a.parent().addClass("sr_selected")},removeFilter:function(a){var b=a.attr("rel")||"";q.fadeTo(300,0.6);""!==b&&(d=d.replace("&"+b,""));n=i.getUrl();s=jQuery.ajax({url:n,success:c.filterAjaxSuccess,error:c.filterAjaxError});a.parent().removeClass("sr_selected")},filterAjaxSuccess:function(a){a=jQuery(a);q.fadeTo(300, 22 | 0,function(){jQuery(this).hide()});c.updateContent(a);f.requests++;b.ajaxCallback(f);y.animate({scrollTop:b.filterScrollTop(E||{top:0,left:0})},600)},filterAjaxError:function(){q.fadeTo(300,0,function(){jQuery(this).hide()});alert(b.filterErrorMsg);e("Houve um erro ao tentar fazer a requisi\u00e7\u00e3o da p\u00e1gina com filtros.")},updateContent:function(a){v=!0;if(!b.authorizeUpdate(f))return!1;var c=a.filter(b.shelfClass),a=h.find(b.shelfClass);(0'), // Elemento Html da busca vazia 23 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 24 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 25 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 26 | searchUrl:null, // Url da página de busca (opicional) 27 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 28 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 29 | callback:function(){}, 30 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 31 | getShelfHeight:function() 32 | { 33 | return (loadContentE.scrollTop()+loadContentE.height()); 34 | }, 35 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 36 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 37 | ajaxCallback:function(){}, 38 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 39 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 40 | emptySearchCallback:function(){}, 41 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 42 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 43 | authorizeScroll:function(){return true;}, 44 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 45 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 46 | authorizeUpdate:function(){return true;} 47 | }; 48 | var options=jQuery.extend(defaults, opts), 49 | _console="object"==typeof(console), 50 | $empty=jQuery(""); 51 | 52 | var loadContentE=jQuery(options.loadContent), 53 | filtersMenuE=jQuery(options.filtersMenu); 54 | // Reporting Errors 55 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 56 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 57 | 58 | var currentUrl=document.location.href, 59 | linksMenuE=jQuery(options.linksMenu), 60 | prodOverlay=jQuery('
'), 61 | _document=jQuery(document), 62 | _window=jQuery(window), 63 | body=jQuery("body"), 64 | urlFilters="", 65 | pageNumber=1, 66 | currentPage=2, 67 | searchUrl="", 68 | currentSearchUrl="", 69 | shelfJqxhr=null, 70 | elemLoading=jQuery(options.elemLoading), 71 | pageJqxhr=null, 72 | ajaxCallbackObj={requests:0,filters:0, isEmpty:false}, 73 | moreResults=true; 74 | 75 | options.emptySearchElem.append(options.emptySearchMsg); 76 | loadContentE.before(prodOverlay); 77 | 78 | var fns= 79 | { 80 | exec:function() 81 | { 82 | fns.setFilterMenu(); 83 | $this.each(function(){ 84 | var _this=jQuery(this); 85 | 86 | fns.adjustText(_this); 87 | filtersMenuE.css("visibility","visible"); 88 | 89 | _this.bind("change",function(){ 90 | fns.inputAction(); 91 | if(_this.is(":checked")) 92 | fns.addFilter(_this); 93 | else 94 | fns.removeFilter(_this); 95 | ajaxCallbackObj.filters=$this.filter(":checked").length; 96 | }); 97 | }); 98 | }, 99 | inputAction:function() 100 | { 101 | if(null!==pageJqxhr) pageJqxhr.abort(); 102 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 103 | currentPage=2; 104 | }, 105 | addFilter:function(input) 106 | { 107 | urlFilters+="&"+(input.attr("rel")||""); 108 | prodOverlay.fadeTo(300,0.6); 109 | currentSearchUrl=fns.getUrl(); 110 | shelfJqxhr=jQuery.ajax({ 111 | url:currentSearchUrl, 112 | success:fns.filterAjaxSuccess, 113 | error:fns.filterAjaxError 114 | }); 115 | }, 116 | removeFilter:function(input) 117 | { 118 | var url=(input.attr("rel")||""); 119 | prodOverlay.fadeTo(300,0.6); 120 | if(url!=="") 121 | urlFilters=urlFilters.replace("&"+url,""); 122 | 123 | currentSearchUrl=fns.getUrl(); 124 | shelfJqxhr=jQuery.ajax({ 125 | url:currentSearchUrl, 126 | success:fns.filterAjaxSuccess, 127 | error:fns.filterAjaxError 128 | }); 129 | }, 130 | getUrl:function(scroll) 131 | { 132 | var s=scroll||false; 133 | if(s) 134 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 135 | else 136 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 137 | }, 138 | filterAjaxSuccess:function(data) 139 | { 140 | var $data=jQuery(data); 141 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 142 | fns.updateContent($data); 143 | ajaxCallbackObj.requests++; 144 | options.ajaxCallback(ajaxCallbackObj); 145 | }, 146 | filterAjaxError:function() 147 | { 148 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 149 | alert(options.filterErrorMsg); 150 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 151 | }, 152 | updateContent:function($data) 153 | { 154 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 155 | 156 | var shelf=$data.filter(options.shelfClass); 157 | var shelfPage=loadContentE.find(options.shelfClass); 158 | 159 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 160 | jQuery(this).remove(); 161 | 162 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 163 | // corrigir um bug encontrado ao clicar em vários filtros 164 | if(options.usePopup) 165 | body.find(".boxPopUp2").vtexPopUp2(); 166 | else 167 | options.emptySearchElem.remove(); 168 | 169 | if(shelf.length>0) 170 | { 171 | shelf.hide(); 172 | loadContentE.append(shelf); 173 | shelf.slideDown(600); 174 | ajaxCallbackObj.isEmpty=false; 175 | } 176 | else 177 | { 178 | ajaxCallbackObj.isEmpty=true; 179 | 180 | if(options.usePopup) 181 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 182 | else 183 | { 184 | loadContentE.append(options.emptySearchElem); 185 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 186 | options.emptySearchElem.fadeTo(300,1); 187 | }); 188 | } 189 | 190 | options.emptySearchCallback(ajaxCallbackObj); 191 | } 192 | }); 193 | }, 194 | adjustText:function(input) 195 | { 196 | var label=input.parent(), 197 | text=label.text(); 198 | qtt=""; 199 | 200 | text=text.replace(/\([0-9]+\)/ig,function(a){ 201 | qtt=a.replace(/\(|\)/,""); 202 | return ""; 203 | }); 204 | 205 | label.text(text).prepend(input); 206 | }, 207 | getSearchUrl:function() 208 | { 209 | var url, content, preg; 210 | jQuery("script:not([src])").each(function(){ 211 | content=jQuery(this)[0].innerHTML; 212 | preg=/\/buscapagina\?.+&PageNumber=/i; 213 | if(content.search(/\/buscapagina\?/i)>-1) 214 | { 215 | url=preg.exec(content); 216 | return false; 217 | } 218 | }); 219 | 220 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 221 | return url[0]; 222 | else 223 | { 224 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 225 | return ""; 226 | } 227 | }, 228 | scrollToTop:function() 229 | { 230 | var elem=body.find("#returnToTop"); 231 | var windowH=_window.height(); 232 | var _html=jQuery("html,body"); 233 | _window.bind("resize",function(){ 234 | windowH=_window.height(); 235 | }); 236 | _window.bind("scroll",function(){ 237 | if(_window.scrollTop()>(windowH)) 238 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 239 | else 240 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 241 | }); 242 | elem.find("a").bind("click",function(){ 243 | _html.animate({scrollTop:0},"slow"); 244 | return false; 245 | }); 246 | }, 247 | setFilterMenu:function() 248 | { 249 | if(filtersMenuE.length>0) 250 | { 251 | linksMenuE.hide(); 252 | filtersMenuE.show(); 253 | } 254 | }, 255 | infinitScroll:function() 256 | { 257 | var elementPages=body.find(".pager:first").attr("id"), 258 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 259 | currentStatus=true; 260 | 261 | // Reportando erros 262 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 263 | 264 | _window.bind('scroll',function(){ 265 | var _this=jQuery(this); 266 | if(currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 267 | { 268 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight()) && currentStatus) 269 | { 270 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 271 | currentItems.after(elemLoading); 272 | currentStatus=false; 273 | pageJqxhr=jQuery.ajax({ 274 | url: fns.getUrl(true), 275 | success:function(data) 276 | { 277 | if(data.trim().length<1) 278 | { 279 | moreResults=false; 280 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+currentPage); 281 | } 282 | else 283 | currentItems.after(data); 284 | currentStatus=true; 285 | elemLoading.remove(); 286 | ajaxCallbackObj.requests++; 287 | options.ajaxCallback(ajaxCallbackObj); 288 | } 289 | }); 290 | currentPage++; 291 | } 292 | } 293 | else 294 | return false; 295 | }); 296 | } 297 | }; 298 | 299 | if(null!==options.searchUrl) 300 | currentSearchUrl=searchUrl=options.searchUrl; 301 | else 302 | currentSearchUrl=searchUrl=fns.getSearchUrl(); 303 | 304 | fns.exec(); 305 | fns.infinitScroll(); 306 | fns.scrollToTop(); 307 | options.callback(); 308 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.2.5.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 2.5 7 | * @date 2012-04-10 8 | */ 9 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 10 | jQuery.fn.vtexSmartResearch=function(opts) 11 | { 12 | $this=jQuery(this); 13 | 14 | var defaults= 15 | { 16 | pageLimit:null, // Número máximo de páginas (limite da paginação) 17 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 18 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 19 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 20 | linksMenu:".search-single-navigator", // Menu de links 21 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | searchUrl:null, // Url da página de busca (opicional) 29 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 30 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 31 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 32 | callback:function(){}, 33 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 34 | getShelfHeight:function() 35 | { 36 | return (loadContentE.scrollTop()+loadContentE.height()); 37 | }, 38 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 39 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 40 | ajaxCallback:function(){}, 41 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 42 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 43 | emptySearchCallback:function(){}, 44 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 45 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 46 | authorizeScroll:function(){return true;}, 47 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 48 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 49 | authorizeUpdate:function(){return true;} 50 | }; 51 | var options=jQuery.extend(defaults, opts), 52 | _console="object"===typeof(console), 53 | $empty=jQuery(""); 54 | 55 | // Reporting Errors 56 | if($this.length<1) 57 | { 58 | if(_console) console.log("[Aviso] Elemento não encontrado \n ("+$this.selector+")"); 59 | if(options.showLinks) jQuery(options.linksMenu).show(); 60 | return $this; 61 | } 62 | 63 | var loadContentE=jQuery(options.loadContent), 64 | filtersMenuE=jQuery(options.filtersMenu); 65 | // Reporting Errors 66 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 67 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 68 | 69 | 70 | var currentUrl=document.location.href, 71 | linksMenuE=jQuery(options.linksMenu), 72 | prodOverlay=jQuery('
'), 73 | _document=jQuery(document), 74 | _window=jQuery(window), 75 | body=jQuery("body"), 76 | urlFilters="", 77 | pageNumber=1, 78 | currentPage=2, 79 | searchUrl="", 80 | currentSearchUrl="", 81 | shelfJqxhr=null, 82 | elemLoading=jQuery(options.elemLoading), 83 | pageJqxhr=null, 84 | ajaxCallbackObj={requests:0,filters:0, isEmpty:false}, 85 | moreResults=true; 86 | 87 | options.emptySearchElem.append(options.emptySearchMsg); 88 | loadContentE.before(prodOverlay); 89 | 90 | var fns= 91 | { 92 | exec:function() 93 | { 94 | fns.setFilterMenu(); 95 | $this.each(function(){ 96 | var _this=jQuery(this); 97 | 98 | fns.adjustText(_this); 99 | filtersMenuE.css("visibility","visible"); 100 | 101 | _this.bind("change",function(){ 102 | fns.inputAction(); 103 | if(_this.is(":checked")) 104 | fns.addFilter(_this); 105 | else 106 | fns.removeFilter(_this); 107 | ajaxCallbackObj.filters=$this.filter(":checked").length; 108 | }); 109 | }); 110 | }, 111 | mergeMenu:function() 112 | { 113 | 114 | if(!options.mergeMenu) return false; 115 | 116 | var elem=body.find(options.menuDepartament); 117 | elem.insertAfter(options.insertMenuAfter); 118 | fns.departamentMenuFormat(elem); 119 | }, 120 | departamentMenuFormat:function(elem) 121 | { 122 | elem.find("a").each(function(){ 123 | var a=jQuery(this); 124 | a.text(fns.removeCounter(a.text())); 125 | }); 126 | }, 127 | inputAction:function() 128 | { 129 | if(null!==pageJqxhr) pageJqxhr.abort(); 130 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 131 | currentPage=2; 132 | moreResults=true; 133 | }, 134 | addFilter:function(input) 135 | { 136 | urlFilters+="&"+(input.attr("rel")||""); 137 | prodOverlay.fadeTo(300,0.6); 138 | currentSearchUrl=fns.getUrl(); 139 | shelfJqxhr=jQuery.ajax({ 140 | url:currentSearchUrl, 141 | success:fns.filterAjaxSuccess, 142 | error:fns.filterAjaxError 143 | }); 144 | }, 145 | removeFilter:function(input) 146 | { 147 | var url=(input.attr("rel")||""); 148 | prodOverlay.fadeTo(300,0.6); 149 | if(url!=="") 150 | urlFilters=urlFilters.replace("&"+url,""); 151 | 152 | currentSearchUrl=fns.getUrl(); 153 | shelfJqxhr=jQuery.ajax({ 154 | url:currentSearchUrl, 155 | success:fns.filterAjaxSuccess, 156 | error:fns.filterAjaxError 157 | }); 158 | }, 159 | getUrl:function(scroll) 160 | { 161 | var s=scroll||false; 162 | if(s) 163 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 164 | else 165 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 166 | }, 167 | filterAjaxSuccess:function(data) 168 | { 169 | var $data=jQuery(data); 170 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 171 | fns.updateContent($data); 172 | ajaxCallbackObj.requests++; 173 | options.ajaxCallback(ajaxCallbackObj); 174 | }, 175 | filterAjaxError:function() 176 | { 177 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 178 | alert(options.filterErrorMsg); 179 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 180 | }, 181 | updateContent:function($data) 182 | { 183 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 184 | 185 | var shelf=$data.filter(options.shelfClass); 186 | var shelfPage=loadContentE.find(options.shelfClass); 187 | 188 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 189 | jQuery(this).remove(); 190 | 191 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 192 | // corrigir um bug encontrado ao clicar em vários filtros 193 | if(options.usePopup) 194 | body.find(".boxPopUp2").vtexPopUp2(); 195 | else 196 | options.emptySearchElem.remove(); 197 | 198 | if(shelf.length>0) 199 | { 200 | shelf.hide(); 201 | loadContentE.append(shelf); 202 | shelf.slideDown(600); 203 | ajaxCallbackObj.isEmpty=false; 204 | } 205 | else 206 | { 207 | ajaxCallbackObj.isEmpty=true; 208 | 209 | if(options.usePopup) 210 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 211 | else 212 | { 213 | loadContentE.append(options.emptySearchElem); 214 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 215 | options.emptySearchElem.fadeTo(300,1); 216 | }); 217 | } 218 | 219 | options.emptySearchCallback(ajaxCallbackObj); 220 | } 221 | }); 222 | }, 223 | adjustText:function(input) 224 | { 225 | var label=input.parent(), 226 | text=label.text(); 227 | qtt=""; 228 | 229 | text=fns.removeCounter(text); 230 | 231 | label.text(text).prepend(input); 232 | }, 233 | removeCounter:function(text) 234 | { 235 | return text.replace(/\([0-9]+\)/ig,function(a){ 236 | qtt=a.replace(/\(|\)/,""); 237 | return ""; 238 | }); 239 | }, 240 | getSearchUrl:function() 241 | { 242 | var url, content, preg; 243 | jQuery("script:not([src])").each(function(){ 244 | content=jQuery(this)[0].innerHTML; 245 | preg=/\/buscapagina\?.+&PageNumber=/i; 246 | if(content.search(/\/buscapagina\?/i)>-1) 247 | { 248 | url=preg.exec(content); 249 | return false; 250 | } 251 | }); 252 | 253 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 254 | return url[0]; 255 | else 256 | { 257 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 258 | return ""; 259 | } 260 | }, 261 | scrollToTop:function() 262 | { 263 | var elem=body.find("#returnToTop"); 264 | var windowH=_window.height(); 265 | var _html=jQuery("html,body"); 266 | _window.bind("resize",function(){ 267 | windowH=_window.height(); 268 | }); 269 | _window.bind("scroll",function(){ 270 | if(_window.scrollTop()>(windowH)) 271 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 272 | else 273 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 274 | }); 275 | elem.find("a").bind("click",function(){ 276 | _html.animate({scrollTop:0},"slow"); 277 | return false; 278 | }); 279 | }, 280 | setFilterMenu:function() 281 | { 282 | if(filtersMenuE.length>0) 283 | { 284 | linksMenuE.hide(); 285 | filtersMenuE.show(); 286 | } 287 | }, 288 | infinitScroll:function() 289 | { 290 | var elementPages=body.find(".pager:first").attr("id"), 291 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 292 | currentStatus=true; 293 | 294 | // Reportando erros 295 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 296 | 297 | _window.bind('scroll',function(){ 298 | var _this=jQuery(this); 299 | if(currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 300 | { 301 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight()) && currentStatus) 302 | { 303 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 304 | currentItems.after(elemLoading); 305 | currentStatus=false; 306 | pageJqxhr=jQuery.ajax({ 307 | url: fns.getUrl(true), 308 | success:function(data) 309 | { 310 | if(data.trim().length<1) 311 | { 312 | moreResults=false; 313 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 314 | } 315 | else 316 | currentItems.after(data); 317 | currentStatus=true; 318 | elemLoading.remove(); 319 | ajaxCallbackObj.requests++; 320 | options.ajaxCallback(ajaxCallbackObj); 321 | } 322 | }); 323 | currentPage++; 324 | } 325 | } 326 | else 327 | return false; 328 | }); 329 | } 330 | }; 331 | 332 | if(null!==options.searchUrl) 333 | currentSearchUrl=searchUrl=options.searchUrl; 334 | else 335 | currentSearchUrl=searchUrl=fns.getSearchUrl(); 336 | 337 | if(body.hasClass("departamento")) 338 | fns.mergeMenu(); 339 | 340 | fns.exec(); 341 | fns.infinitScroll(); 342 | fns.scrollToTop(); 343 | options.callback(); 344 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.0.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.0 7 | * @date 2012-04-11 8 | */ 9 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 10 | jQuery.fn.vtexSmartResearch=function(opts) 11 | { 12 | $this=jQuery(this); 13 | 14 | var defaults= 15 | { 16 | pageLimit:null, // Número máximo de páginas (limite da paginação) 17 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 18 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 19 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 20 | linksMenu:".search-single-navigator", // Menu de links 21 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 22 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 23 | emptySearchElem:jQuery('
'), // Elemento Html da busca vazia 24 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 25 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 26 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 27 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 28 | searchUrl:null, // Url da página de busca (opicional) 29 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 30 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 31 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 32 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 33 | callback:function(){}, 34 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 35 | getShelfHeight:function(container) 36 | { 37 | return (container.scrollTop()+container.height()); 38 | }, 39 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 40 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 41 | ajaxCallback:function(){}, 42 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 43 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 44 | emptySearchCallback:function(){}, 45 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | authorizeScroll:function(){return true;}, 48 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | authorizeUpdate:function(){return true;} 51 | }; 52 | 53 | var options=jQuery.extend(defaults, opts), 54 | _console="object"===typeof(console), 55 | $empty=jQuery(""), 56 | elemLoading=jQuery(options.elemLoading), 57 | currentPage=2, 58 | moreResults=true, 59 | _window=jQuery(window), 60 | _document=jQuery(document), 61 | _html=jQuery("html,body"), 62 | body=jQuery("body"), 63 | currentSearchUrl="", 64 | urlFilters="", 65 | searchUrl="", 66 | loadContentE=jQuery(options.loadContent), 67 | filtersMenuE=jQuery(options.filtersMenu), 68 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}; 69 | 70 | var fn= 71 | { 72 | getUrl:function(scroll) 73 | { 74 | var s=scroll||false; 75 | if(s) 76 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 77 | else 78 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 79 | }, 80 | getSearchUrl:function() 81 | { 82 | var url, content, preg; 83 | jQuery("script:not([src])").each(function(){ 84 | content=jQuery(this)[0].innerHTML; 85 | preg=/\/buscapagina\?.+&PageNumber=/i; 86 | if(content.search(/\/buscapagina\?/i)>-1) 87 | { 88 | url=preg.exec(content); 89 | return false; 90 | } 91 | }); 92 | 93 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 94 | return url[0]; 95 | else 96 | { 97 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 98 | return ""; 99 | } 100 | }, 101 | scrollToTop:function() 102 | { 103 | var elem=body.find("#returnToTop"); 104 | 105 | if(elem.length<1) 106 | { 107 | elem=jQuery(''); 108 | body.append(elem); 109 | } 110 | 111 | var windowH=_window.height(); 112 | _window.bind("resize",function(){ 113 | windowH=_window.height(); 114 | }); 115 | _window.bind("scroll",function(){ 116 | if(_window.scrollTop()>(windowH)) 117 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 118 | else 119 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 120 | }); 121 | elem.bind("click",function(){ 122 | _html.animate({scrollTop:0},"slow"); 123 | return false; 124 | }); 125 | }, 126 | infinitScroll:function() 127 | { 128 | var elementPages=body.find(".pager:first").attr("id"), 129 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 130 | currentStatus=true; 131 | 132 | // Reportando erros 133 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 134 | 135 | _window.bind('scroll',function(){ 136 | var _this=jQuery(this); 137 | if(currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 138 | { 139 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 140 | { 141 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 142 | currentItems.after(elemLoading); 143 | currentStatus=false; 144 | pageJqxhr=jQuery.ajax({ 145 | url: fn.getUrl(true), 146 | success:function(data) 147 | { 148 | if(data.trim().length<1) 149 | { 150 | moreResults=false; 151 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 152 | } 153 | else 154 | currentItems.after(data); 155 | currentStatus=true; 156 | elemLoading.remove(); 157 | ajaxCallbackObj.requests++; 158 | options.ajaxCallback(ajaxCallbackObj); 159 | } 160 | }); 161 | currentPage++; 162 | } 163 | } 164 | else 165 | return false; 166 | }); 167 | } 168 | } 169 | 170 | if(null!==options.searchUrl) 171 | currentSearchUrl=searchUrl=options.searchUrl; 172 | else 173 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 174 | 175 | // Reporting Errors 176 | if($this.length<1) 177 | { 178 | if(_console) console.log("[Aviso] Nenhuma opção de filtro encontrada"); 179 | if(options.showLinks) jQuery(options.linksMenu).show(); 180 | fn.infinitScroll(); 181 | fn.scrollToTop(); 182 | return $this; 183 | } 184 | 185 | // Reporting Errors 186 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 187 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 188 | 189 | var currentUrl=document.location.href, 190 | linksMenuE=jQuery(options.linksMenu), 191 | prodOverlay=jQuery('
'), 192 | departamentE=jQuery(options.menuDepartament), 193 | loadContentOffset=loadContentE.offset(), 194 | pageNumber=1, 195 | shelfJqxhr=null, 196 | pageJqxhr=null; 197 | 198 | options.emptySearchElem.append(options.emptySearchMsg); 199 | loadContentE.before(prodOverlay); 200 | 201 | var fns= 202 | { 203 | exec:function() 204 | { 205 | fns.setFilterMenu(); 206 | $this.each(function(){ 207 | var _this=jQuery(this); 208 | 209 | if(_this.is(":checked")) 210 | urlFilters+="&"+(_this.attr("rel")||""); 211 | 212 | fns.adjustText(_this); 213 | filtersMenuE.css("visibility","visible"); 214 | 215 | _this.bind("change",function(){ 216 | fns.inputAction(); 217 | if(_this.is(":checked")) 218 | fns.addFilter(_this); 219 | else 220 | fns.removeFilter(_this); 221 | ajaxCallbackObj.filters=$this.filter(":checked").length; 222 | }); 223 | }); 224 | 225 | if(""!==urlFilters) 226 | fns.addFilter($empty); 227 | }, 228 | mergeMenu:function() 229 | { 230 | if(!options.mergeMenu) return false; 231 | 232 | var elem=departamentE; 233 | elem.insertAfter(options.insertMenuAfter); 234 | fns.departamentMenuFormat(elem); 235 | }, 236 | mergeMenuList:function() 237 | { 238 | var i=0; 239 | filtersMenuE.find("h3,h4").each(function(){ 240 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 241 | ul.insertAfter(jQuery(this)); 242 | fns.departamentMenuFormat(ul); 243 | i++; 244 | }); 245 | }, 246 | departamentMenuFormat:function(elem) 247 | { 248 | elem.find("a").each(function(){ 249 | var a=jQuery(this); 250 | a.text(fns.removeCounter(a.text())); 251 | }); 252 | }, 253 | inputAction:function() 254 | { 255 | if(null!==pageJqxhr) pageJqxhr.abort(); 256 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 257 | currentPage=2; 258 | moreResults=true; 259 | }, 260 | addFilter:function(input) 261 | { 262 | urlFilters+="&"+(input.attr("rel")||""); 263 | prodOverlay.fadeTo(300,0.6); 264 | currentSearchUrl=fn.getUrl(); 265 | shelfJqxhr=jQuery.ajax({ 266 | url:currentSearchUrl, 267 | success:fns.filterAjaxSuccess, 268 | error:fns.filterAjaxError 269 | }); 270 | }, 271 | removeFilter:function(input) 272 | { 273 | var url=(input.attr("rel")||""); 274 | prodOverlay.fadeTo(300,0.6); 275 | if(url!=="") 276 | urlFilters=urlFilters.replace("&"+url,""); 277 | 278 | currentSearchUrl=fn.getUrl(); 279 | shelfJqxhr=jQuery.ajax({ 280 | url:currentSearchUrl, 281 | success:fns.filterAjaxSuccess, 282 | error:fns.filterAjaxError 283 | }); 284 | }, 285 | filterAjaxSuccess:function(data) 286 | { 287 | var $data=jQuery(data); 288 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 289 | fns.updateContent($data); 290 | ajaxCallbackObj.requests++; 291 | options.ajaxCallback(ajaxCallbackObj); 292 | _html.animate({scrollTop:((loadContentOffset.top||0)-20)},"slow"); 293 | }, 294 | filterAjaxError:function() 295 | { 296 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 297 | alert(options.filterErrorMsg); 298 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 299 | }, 300 | updateContent:function($data) 301 | { 302 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 303 | 304 | var shelf=$data.filter(options.shelfClass); 305 | var shelfPage=loadContentE.find(options.shelfClass); 306 | 307 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 308 | jQuery(this).remove(); 309 | 310 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 311 | // corrigir um bug encontrado ao clicar em vários filtros 312 | if(options.usePopup) 313 | body.find(".boxPopUp2").vtexPopUp2(); 314 | else 315 | options.emptySearchElem.remove(); 316 | 317 | if(shelf.length>0) 318 | { 319 | shelf.hide(); 320 | loadContentE.append(shelf); 321 | shelf.slideDown(600); 322 | ajaxCallbackObj.isEmpty=false; 323 | } 324 | else 325 | { 326 | ajaxCallbackObj.isEmpty=true; 327 | 328 | if(options.usePopup) 329 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 330 | else 331 | { 332 | loadContentE.append(options.emptySearchElem); 333 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 334 | options.emptySearchElem.fadeTo(300,1); 335 | }); 336 | } 337 | 338 | options.emptySearchCallback(ajaxCallbackObj); 339 | } 340 | }); 341 | }, 342 | adjustText:function(input) 343 | { 344 | var label=input.parent(), 345 | text=label.text(); 346 | qtt=""; 347 | 348 | text=fns.removeCounter(text); 349 | 350 | label.text(text).prepend(input); 351 | }, 352 | removeCounter:function(text) 353 | { 354 | return text.replace(/\([0-9]+\)/ig,function(a){ 355 | qtt=a.replace(/\(|\)/,""); 356 | return ""; 357 | }); 358 | }, 359 | setFilterMenu:function() 360 | { 361 | if(filtersMenuE.length>0) 362 | { 363 | linksMenuE.hide(); 364 | filtersMenuE.show(); 365 | } 366 | } 367 | }; 368 | 369 | if(body.hasClass("departamento")) 370 | fns.mergeMenu(); 371 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 372 | fns.mergeMenuList(); 373 | 374 | fns.exec(); 375 | fn.infinitScroll(); 376 | fn.scrollToTop(); 377 | options.callback(); 378 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.1.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.1 7 | * @date 2012-04-12 8 | */ 9 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 10 | jQuery.fn.vtexSmartResearch=function(opts) 11 | { 12 | $this=jQuery(this); 13 | 14 | var defaults= 15 | { 16 | pageLimit:null, // Número máximo de páginas (limite da paginação) 17 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 18 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 19 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 20 | linksMenu:".search-single-navigator", // Menu de links 21 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 22 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 23 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 24 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 25 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 26 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 27 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 28 | searchUrl:null, // Url da página de busca (opicional) 29 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 30 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 31 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 32 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 33 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 34 | filterScrollTop:function(shelfOffset) 35 | { 36 | return (shelfOffset.top-20); 37 | }, 38 | callback:function(){}, 39 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 40 | getShelfHeight:function(container) 41 | { 42 | return (container.scrollTop()+container.height()); 43 | }, 44 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 45 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 46 | ajaxCallback:function(){}, 47 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 48 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 49 | emptySearchCallback:function(){}, 50 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 51 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 52 | authorizeScroll:function(){return true;}, 53 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 54 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 55 | authorizeUpdate:function(){return true;} 56 | }; 57 | 58 | var options=jQuery.extend(defaults, opts), 59 | _console="object"===typeof(console), 60 | $empty=jQuery(""), 61 | elemLoading=jQuery(options.elemLoading), 62 | currentPage=2, 63 | moreResults=true, 64 | _window=jQuery(window), 65 | _document=jQuery(document), 66 | _html=jQuery("html,body"), 67 | body=jQuery("body"), 68 | currentSearchUrl="", 69 | urlFilters="", 70 | searchUrl="", 71 | animatingFilter=false, 72 | loadContentE=jQuery(options.loadContent), 73 | filtersMenuE=jQuery(options.filtersMenu), 74 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}; 75 | 76 | var fn= 77 | { 78 | getUrl:function(scroll) 79 | { 80 | var s=scroll||false; 81 | if(s) 82 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 83 | else 84 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 85 | }, 86 | getSearchUrl:function() 87 | { 88 | var url, content, preg; 89 | jQuery("script:not([src])").each(function(){ 90 | content=jQuery(this)[0].innerHTML; 91 | preg=/\/buscapagina\?.+&PageNumber=/i; 92 | if(content.search(/\/buscapagina\?/i)>-1) 93 | { 94 | url=preg.exec(content); 95 | return false; 96 | } 97 | }); 98 | 99 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 100 | return url[0]; 101 | else 102 | { 103 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 104 | return ""; 105 | } 106 | }, 107 | scrollToTop:function() 108 | { 109 | var elem=body.find("#returnToTop"); 110 | 111 | if(elem.length<1) 112 | { 113 | elem=jQuery(''); 114 | body.append(elem); 115 | } 116 | 117 | var windowH=_window.height(); 118 | _window.bind("resize",function(){ 119 | windowH=_window.height(); 120 | }); 121 | _window.bind("scroll",function(){ 122 | if(_window.scrollTop()>(windowH)) 123 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 124 | else 125 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 126 | }); 127 | elem.bind("click",function(){ 128 | _html.animate({scrollTop:0},"slow"); 129 | return false; 130 | }); 131 | }, 132 | infinitScroll:function() 133 | { 134 | var elementPages=body.find(".pager:first").attr("id"), 135 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 136 | currentStatus=true; 137 | 138 | // Reportando erros 139 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 140 | 141 | _window.bind('scroll',function(){ 142 | var _this=jQuery(this); 143 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 144 | { 145 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 146 | { 147 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 148 | currentItems.after(elemLoading); 149 | currentStatus=false; 150 | pageJqxhr=jQuery.ajax({ 151 | url: fn.getUrl(true), 152 | success:function(data) 153 | { 154 | if(data.trim().length<1) 155 | { 156 | moreResults=false; 157 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 158 | } 159 | else 160 | currentItems.after(data); 161 | currentStatus=true; 162 | elemLoading.remove(); 163 | ajaxCallbackObj.requests++; 164 | options.ajaxCallback(ajaxCallbackObj); 165 | } 166 | }); 167 | currentPage++; 168 | } 169 | } 170 | else 171 | return false; 172 | }); 173 | } 174 | } 175 | 176 | if(null!==options.searchUrl) 177 | currentSearchUrl=searchUrl=options.searchUrl; 178 | else 179 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 180 | 181 | // Reporting Errors 182 | if($this.length<1) 183 | { 184 | if(_console) console.log("[Aviso] Nenhuma opção de filtro encontrada"); 185 | if(options.showLinks) jQuery(options.linksMenu).show(); 186 | fn.infinitScroll(); 187 | fn.scrollToTop(); 188 | return $this; 189 | } 190 | 191 | // Reporting Errors 192 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 193 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 194 | 195 | var currentUrl=document.location.href, 196 | linksMenuE=jQuery(options.linksMenu), 197 | prodOverlay=jQuery('
'), 198 | departamentE=jQuery(options.menuDepartament), 199 | loadContentOffset=loadContentE.offset(), 200 | pageNumber=1, 201 | shelfJqxhr=null, 202 | pageJqxhr=null; 203 | 204 | options.emptySearchElem.append(options.emptySearchMsg); 205 | loadContentE.before(prodOverlay); 206 | 207 | var fns= 208 | { 209 | exec:function() 210 | { 211 | fns.setFilterMenu(); 212 | fns.hideTitleEmptyFilters(); 213 | $this.each(function(){ 214 | var _this=jQuery(this); 215 | 216 | if(_this.is(":checked")) 217 | urlFilters+="&"+(_this.attr("rel")||""); 218 | 219 | fns.adjustText(_this); 220 | filtersMenuE.css("visibility","visible"); 221 | 222 | _this.bind("change",function(){ 223 | fns.inputAction(); 224 | if(_this.is(":checked")) 225 | fns.addFilter(_this); 226 | else 227 | fns.removeFilter(_this); 228 | ajaxCallbackObj.filters=$this.filter(":checked").length; 229 | }); 230 | }); 231 | 232 | if(""!==urlFilters) 233 | fns.addFilter($empty); 234 | }, 235 | mergeMenu:function() 236 | { 237 | if(!options.mergeMenu) return false; 238 | 239 | var elem=departamentE; 240 | elem.insertAfter(options.insertMenuAfter); 241 | fns.departamentMenuFormat(elem); 242 | }, 243 | mergeMenuList:function() 244 | { 245 | var i=0; 246 | filtersMenuE.find("h3,h4").each(function(){ 247 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 248 | ul.insertAfter(jQuery(this)); 249 | fns.departamentMenuFormat(ul); 250 | i++; 251 | }); 252 | }, 253 | departamentMenuFormat:function(elem) 254 | { 255 | elem.find("a").each(function(){ 256 | var a=jQuery(this); 257 | a.text(fns.removeCounter(a.text())); 258 | }); 259 | }, 260 | hideTitleEmptyFilters:function() 261 | { 262 | filtersMenuE.find("fieldset").each(function(){ 263 | var $t=jQuery(this); 264 | if($t.find("label").length<1) 265 | $t.hide(); 266 | }); 267 | }, 268 | inputAction:function() 269 | { 270 | if(null!==pageJqxhr) pageJqxhr.abort(); 271 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 272 | currentPage=2; 273 | moreResults=true; 274 | }, 275 | addFilter:function(input) 276 | { 277 | urlFilters+="&"+(input.attr("rel")||""); 278 | prodOverlay.fadeTo(300,0.6); 279 | currentSearchUrl=fn.getUrl(); 280 | shelfJqxhr=jQuery.ajax({ 281 | url:currentSearchUrl, 282 | success:fns.filterAjaxSuccess, 283 | error:fns.filterAjaxError 284 | }); 285 | }, 286 | removeFilter:function(input) 287 | { 288 | var url=(input.attr("rel")||""); 289 | prodOverlay.fadeTo(300,0.6); 290 | if(url!=="") 291 | urlFilters=urlFilters.replace("&"+url,""); 292 | 293 | currentSearchUrl=fn.getUrl(); 294 | shelfJqxhr=jQuery.ajax({ 295 | url:currentSearchUrl, 296 | success:fns.filterAjaxSuccess, 297 | error:fns.filterAjaxError 298 | }); 299 | }, 300 | filterAjaxSuccess:function(data) 301 | { 302 | var $data=jQuery(data); 303 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 304 | fns.updateContent($data); 305 | ajaxCallbackObj.requests++; 306 | options.ajaxCallback(ajaxCallbackObj); 307 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 308 | }, 309 | filterAjaxError:function() 310 | { 311 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 312 | alert(options.filterErrorMsg); 313 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 314 | }, 315 | updateContent:function($data) 316 | { 317 | animatingFilter=true; 318 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 319 | 320 | var shelf=$data.filter(options.shelfClass); 321 | var shelfPage=loadContentE.find(options.shelfClass); 322 | 323 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 324 | jQuery(this).remove(); 325 | 326 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 327 | // corrigir um bug encontrado ao clicar em vários filtros 328 | if(options.usePopup) 329 | body.find(".boxPopUp2").vtexPopUp2(); 330 | else 331 | options.emptySearchElem.remove(); 332 | 333 | if(shelf.length>0) 334 | { 335 | shelf.hide(); 336 | loadContentE.append(shelf); 337 | shelf.slideDown(600,function(){animatingFilter=false;}); 338 | ajaxCallbackObj.isEmpty=false; 339 | } 340 | else 341 | { 342 | ajaxCallbackObj.isEmpty=true; 343 | 344 | if(options.usePopup) 345 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 346 | else 347 | { 348 | loadContentE.append(options.emptySearchElem); 349 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 350 | options.emptySearchElem.fadeTo(300,1); 351 | }); 352 | } 353 | 354 | options.emptySearchCallback(ajaxCallbackObj); 355 | } 356 | }); 357 | }, 358 | adjustText:function(input) 359 | { 360 | var label=input.parent(), 361 | text=label.text(); 362 | qtt=""; 363 | 364 | text=fns.removeCounter(text); 365 | 366 | label.text(text).prepend(input); 367 | }, 368 | removeCounter:function(text) 369 | { 370 | return text.replace(/\([0-9]+\)/ig,function(a){ 371 | qtt=a.replace(/\(|\)/,""); 372 | return ""; 373 | }); 374 | }, 375 | setFilterMenu:function() 376 | { 377 | if(filtersMenuE.length>0) 378 | { 379 | linksMenuE.hide(); 380 | filtersMenuE.show(); 381 | } 382 | } 383 | }; 384 | 385 | if(body.hasClass("departamento")) 386 | fns.mergeMenu(); 387 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 388 | fns.mergeMenuList(); 389 | 390 | fns.exec(); 391 | fn.infinitScroll(); 392 | fn.scrollToTop(); 393 | options.callback(); 394 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.3.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.3 7 | * @date 2012-04-20 8 | */ 9 | if("function"!==typeof(String.prototype.replaceSpecialChars)) String.prototype.replaceSpecialChars=function(){var _replace={"ç":"c","æ":"ae","œ":"oe","á":"a","é":"e","í":"i","ó":"o","ú":"u","à":"a","è":"e","ì":"i","ò":"o","ù":"u","ä":"a","ë":"e","ï":"i","ö":"o","ü":"u","ÿ":"y","â":"a","ê":"e","î":"i","ô":"o","û":"u","å":"a","ã":"a","ø":"o","õ":"o","u":"u","Á":"A","É":"E","Í":"I","Ó":"O","Ú":"U","Ê":"E","Ô":"O","Ü":"U","Ã":"A","Õ":"O","À":"A","Ç":"C"};return this.replace(/[à-ú]/g,function(a){if(typeof(_replace[a])!="undefined") return _replace[a]; return a;});}; 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | ajaxCallback:function(){}, 48 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | emptySearchCallback:function(){}, 51 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 52 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 53 | authorizeScroll:function(){return true;}, 54 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 55 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 56 | authorizeUpdate:function(){return true;} 57 | }; 58 | 59 | var options=jQuery.extend(defaults, opts), 60 | _console="object"===typeof(console), 61 | $empty=jQuery(""), 62 | elemLoading=jQuery(options.elemLoading), 63 | currentPage=2, 64 | moreResults=true, 65 | _window=jQuery(window), 66 | _document=jQuery(document), 67 | _html=jQuery("html,body"), 68 | body=jQuery("body"), 69 | currentSearchUrl="", 70 | urlFilters="", 71 | searchUrl="", 72 | animatingFilter=false, 73 | loadContentE=jQuery(options.loadContent), 74 | filtersMenuE=jQuery(options.filtersMenu), 75 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}; 76 | 77 | var fn= 78 | { 79 | getUrl:function(scroll) 80 | { 81 | var s=scroll||false; 82 | if(s) 83 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 84 | else 85 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 86 | }, 87 | getSearchUrl:function() 88 | { 89 | var url, content, preg; 90 | jQuery("script:not([src])").each(function(){ 91 | content=jQuery(this)[0].innerHTML; 92 | preg=/\/buscapagina\?.+&PageNumber=/i; 93 | if(content.search(/\/buscapagina\?/i)>-1) 94 | { 95 | url=preg.exec(content); 96 | return false; 97 | } 98 | }); 99 | 100 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 101 | return url[0]; 102 | else 103 | { 104 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 105 | return ""; 106 | } 107 | }, 108 | scrollToTop:function() 109 | { 110 | var elem=body.find("#returnToTop"); 111 | 112 | if(elem.length<1) 113 | { 114 | elem=jQuery(''); 115 | body.append(elem); 116 | } 117 | 118 | var windowH=_window.height(); 119 | _window.bind("resize",function(){ 120 | windowH=_window.height(); 121 | }); 122 | _window.bind("scroll",function(){ 123 | if(_window.scrollTop()>(windowH)) 124 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 125 | else 126 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 127 | }); 128 | elem.bind("click",function(){ 129 | _html.animate({scrollTop:0},"slow"); 130 | return false; 131 | }); 132 | }, 133 | infinitScroll:function() 134 | { 135 | var elementPages=body.find(".pager:first").attr("id"), 136 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 137 | currentStatus=true; 138 | 139 | // Reportando erros 140 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 141 | 142 | _window.bind('scroll',function(){ 143 | var _this=jQuery(this); 144 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 145 | { 146 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 147 | { 148 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 149 | currentItems.after(elemLoading); 150 | currentStatus=false; 151 | pageJqxhr=jQuery.ajax({ 152 | url: fn.getUrl(true), 153 | success:function(data) 154 | { 155 | if(data.trim().length<1) 156 | { 157 | moreResults=false; 158 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 159 | } 160 | else 161 | currentItems.after(data); 162 | currentStatus=true; 163 | elemLoading.remove(); 164 | ajaxCallbackObj.requests++; 165 | options.ajaxCallback(ajaxCallbackObj); 166 | } 167 | }); 168 | currentPage++; 169 | } 170 | } 171 | else 172 | return false; 173 | }); 174 | } 175 | } 176 | 177 | if(null!==options.searchUrl) 178 | currentSearchUrl=searchUrl=options.searchUrl; 179 | else 180 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 181 | 182 | // Reporting Errors 183 | if($this.length<1) 184 | { 185 | if(_console) console.log("[Aviso] Nenhuma opção de filtro encontrada"); 186 | if(options.showLinks) jQuery(options.linksMenu).show(); 187 | fn.infinitScroll(); 188 | fn.scrollToTop(); 189 | return $this; 190 | } 191 | 192 | // Reporting Errors 193 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 194 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 195 | 196 | var currentUrl=document.location.href, 197 | linksMenuE=jQuery(options.linksMenu), 198 | prodOverlay=jQuery('
'), 199 | departamentE=jQuery(options.menuDepartament), 200 | loadContentOffset=loadContentE.offset(), 201 | pageNumber=1, 202 | shelfJqxhr=null, 203 | pageJqxhr=null; 204 | 205 | options.emptySearchElem.append(options.emptySearchMsg); 206 | loadContentE.before(prodOverlay); 207 | 208 | var fns= 209 | { 210 | exec:function() 211 | { 212 | fns.setFilterMenu(); 213 | fns.fildsetFormat(); 214 | $this.each(function(){ 215 | var _this=jQuery(this); 216 | 217 | if(_this.is(":checked")) 218 | urlFilters+="&"+(_this.attr("rel")||""); 219 | 220 | fns.adjustText(_this); 221 | filtersMenuE.css("visibility","visible"); 222 | 223 | _this.bind("change",function(){ 224 | fns.inputAction(); 225 | if(_this.is(":checked")) 226 | fns.addFilter(_this); 227 | else 228 | fns.removeFilter(_this); 229 | ajaxCallbackObj.filters=$this.filter(":checked").length; 230 | }); 231 | }); 232 | 233 | if(""!==urlFilters) 234 | fns.addFilter($empty); 235 | }, 236 | mergeMenu:function() 237 | { 238 | if(!options.mergeMenu) return false; 239 | 240 | var elem=departamentE; 241 | elem.insertAfter(options.insertMenuAfter); 242 | fns.departamentMenuFormat(elem); 243 | }, 244 | mergeMenuList:function() 245 | { 246 | var i=0; 247 | filtersMenuE.find("h3,h4").each(function(){ 248 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 249 | ul.insertAfter(jQuery(this)); 250 | fns.departamentMenuFormat(ul); 251 | i++; 252 | }); 253 | }, 254 | departamentMenuFormat:function(elem) 255 | { 256 | elem.find("a").each(function(){ 257 | var a=jQuery(this); 258 | a.text(fns.removeCounter(a.text())); 259 | }); 260 | }, 261 | fildsetFormat:function() 262 | { 263 | filtersMenuE.find("fieldset").each(function(){ 264 | var $t=jQuery(this), 265 | label=$t.find("label"); 266 | 267 | // Ocultar fieldset quando não existe filtro e sair desste método 268 | if(label.length<1) 269 | { 270 | $t.hide(); 271 | return; 272 | } 273 | 274 | // Adicionar classe ao fieldset 275 | $t.addClass("filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-")); 276 | 277 | // Adicionando classe e título ao label 278 | label.each(function(){ 279 | var t=jQuery(this), 280 | v=(t.find("input").val()||""); 281 | t.addClass("sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-")).attr("title",v); 282 | }); 283 | }); 284 | }, 285 | inputAction:function() 286 | { 287 | if(null!==pageJqxhr) pageJqxhr.abort(); 288 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 289 | currentPage=2; 290 | moreResults=true; 291 | }, 292 | addFilter:function(input) 293 | { 294 | urlFilters+="&"+(input.attr("rel")||""); 295 | prodOverlay.fadeTo(300,0.6); 296 | currentSearchUrl=fn.getUrl(); 297 | shelfJqxhr=jQuery.ajax({ 298 | url:currentSearchUrl, 299 | success:fns.filterAjaxSuccess, 300 | error:fns.filterAjaxError 301 | }); 302 | // Adicionando classe ao label 303 | input.parent().addClass("sr_selected"); 304 | }, 305 | removeFilter:function(input) 306 | { 307 | var url=(input.attr("rel")||""); 308 | prodOverlay.fadeTo(300,0.6); 309 | if(url!=="") 310 | urlFilters=urlFilters.replace("&"+url,""); 311 | 312 | currentSearchUrl=fn.getUrl(); 313 | shelfJqxhr=jQuery.ajax({ 314 | url:currentSearchUrl, 315 | success:fns.filterAjaxSuccess, 316 | error:fns.filterAjaxError 317 | }); 318 | // Removendo classe do label 319 | input.parent().removeClass("sr_selected"); 320 | }, 321 | filterAjaxSuccess:function(data) 322 | { 323 | var $data=jQuery(data); 324 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 325 | fns.updateContent($data); 326 | ajaxCallbackObj.requests++; 327 | options.ajaxCallback(ajaxCallbackObj); 328 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 329 | }, 330 | filterAjaxError:function() 331 | { 332 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 333 | alert(options.filterErrorMsg); 334 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 335 | }, 336 | updateContent:function($data) 337 | { 338 | animatingFilter=true; 339 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 340 | 341 | var shelf=$data.filter(options.shelfClass); 342 | var shelfPage=loadContentE.find(options.shelfClass); 343 | 344 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 345 | jQuery(this).remove(); 346 | 347 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 348 | // corrigir um bug encontrado ao clicar em vários filtros 349 | if(options.usePopup) 350 | body.find(".boxPopUp2").vtexPopUp2(); 351 | else 352 | options.emptySearchElem.remove(); 353 | 354 | if(shelf.length>0) 355 | { 356 | shelf.hide(); 357 | loadContentE.append(shelf); 358 | shelf.slideDown(600,function(){animatingFilter=false;}); 359 | ajaxCallbackObj.isEmpty=false; 360 | } 361 | else 362 | { 363 | ajaxCallbackObj.isEmpty=true; 364 | 365 | if(options.usePopup) 366 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 367 | else 368 | { 369 | loadContentE.append(options.emptySearchElem); 370 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 371 | options.emptySearchElem.fadeTo(300,1); 372 | }); 373 | } 374 | 375 | options.emptySearchCallback(ajaxCallbackObj); 376 | } 377 | }); 378 | }, 379 | adjustText:function(input) 380 | { 381 | var label=input.parent(), 382 | text=label.text(); 383 | qtt=""; 384 | 385 | text=fns.removeCounter(text); 386 | 387 | label.text(text).prepend(input); 388 | }, 389 | removeCounter:function(text) 390 | { 391 | return text.replace(/\([0-9]+\)/ig,function(a){ 392 | qtt=a.replace(/\(|\)/,""); 393 | return ""; 394 | }); 395 | }, 396 | setFilterMenu:function() 397 | { 398 | if(filtersMenuE.length>0) 399 | { 400 | linksMenuE.hide(); 401 | filtersMenuE.show(); 402 | } 403 | } 404 | }; 405 | 406 | if(body.hasClass("departamento")) 407 | fns.mergeMenu(); 408 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 409 | fns.mergeMenuList(); 410 | 411 | fns.exec(); 412 | fn.infinitScroll(); 413 | fn.scrollToTop(); 414 | options.callback(); 415 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.2.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.2 7 | * @date 2012-04-16 8 | */ 9 | if("function"!==typeof(String.prototype.replaceSpecialChars)) String.prototype.replaceSpecialChars=function(){var _replace={"ç":"c","æ":"ae","œ":"oe","á":"a","é":"e","í":"i","ó":"o","ú":"u","à":"a","è":"e","ì":"i","ò":"o","ù":"u","ä":"a","ë":"e","ï":"i","ö":"o","ü":"u","ÿ":"y","â":"a","ê":"e","î":"i","ô":"o","û":"u","å":"a","ã":"a","ø":"o","õ":"o","u":"u","Á":"A","É":"E","Í":"I","Ó":"O","Ú":"U","Ê":"E","Ô":"O","Ü":"U","Ã":"A","Õ":"O","À":"A","Ç":"C"};return this.replace(/[à-ú]/g,function(a){if(typeof(_replace[a])!="undefined") return _replace[a]; return a;});}; 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | ajaxCallback:function(){}, 48 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | emptySearchCallback:function(){}, 51 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 52 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 53 | authorizeScroll:function(){return true;}, 54 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 55 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 56 | authorizeUpdate:function(){return true;} 57 | }; 58 | 59 | var options=jQuery.extend(defaults, opts), 60 | _console="object"===typeof(console), 61 | $empty=jQuery(""), 62 | elemLoading=jQuery(options.elemLoading), 63 | currentPage=2, 64 | moreResults=true, 65 | _window=jQuery(window), 66 | _document=jQuery(document), 67 | _html=jQuery("html,body"), 68 | body=jQuery("body"), 69 | currentSearchUrl="", 70 | urlFilters="", 71 | searchUrl="", 72 | animatingFilter=false, 73 | loadContentE=jQuery(options.loadContent), 74 | filtersMenuE=jQuery(options.filtersMenu), 75 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}; 76 | 77 | var fn= 78 | { 79 | getUrl:function(scroll) 80 | { 81 | var s=scroll||false; 82 | if(s) 83 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 84 | else 85 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 86 | }, 87 | getSearchUrl:function() 88 | { 89 | var url, content, preg; 90 | jQuery("script:not([src])").each(function(){ 91 | content=jQuery(this)[0].innerHTML; 92 | preg=/\/buscapagina\?.+&PageNumber=/i; 93 | if(content.search(/\/buscapagina\?/i)>-1) 94 | { 95 | url=preg.exec(content); 96 | return false; 97 | } 98 | }); 99 | 100 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 101 | return url[0]; 102 | else 103 | { 104 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 105 | return ""; 106 | } 107 | }, 108 | scrollToTop:function() 109 | { 110 | var elem=body.find("#returnToTop"); 111 | 112 | if(elem.length<1) 113 | { 114 | elem=jQuery(''); 115 | body.append(elem); 116 | } 117 | 118 | var windowH=_window.height(); 119 | _window.bind("resize",function(){ 120 | windowH=_window.height(); 121 | }); 122 | _window.bind("scroll",function(){ 123 | if(_window.scrollTop()>(windowH)) 124 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 125 | else 126 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 127 | }); 128 | elem.bind("click",function(){ 129 | _html.animate({scrollTop:0},"slow"); 130 | return false; 131 | }); 132 | }, 133 | infinitScroll:function() 134 | { 135 | var elementPages=body.find(".pager:first").attr("id"), 136 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 137 | currentStatus=true; 138 | 139 | // Reportando erros 140 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 141 | 142 | _window.bind('scroll',function(){ 143 | var _this=jQuery(this); 144 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 145 | { 146 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 147 | { 148 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 149 | currentItems.after(elemLoading); 150 | currentStatus=false; 151 | pageJqxhr=jQuery.ajax({ 152 | url: fn.getUrl(true), 153 | success:function(data) 154 | { 155 | if(data.trim().length<1) 156 | { 157 | moreResults=false; 158 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 159 | } 160 | else 161 | currentItems.after(data); 162 | currentStatus=true; 163 | elemLoading.remove(); 164 | ajaxCallbackObj.requests++; 165 | options.ajaxCallback(ajaxCallbackObj); 166 | } 167 | }); 168 | currentPage++; 169 | } 170 | } 171 | else 172 | return false; 173 | }); 174 | } 175 | } 176 | 177 | if(null!==options.searchUrl) 178 | currentSearchUrl=searchUrl=options.searchUrl; 179 | else 180 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 181 | 182 | // Reporting Errors 183 | if($this.length<1) 184 | { 185 | if(_console) console.log("[Aviso] Nenhuma opção de filtro encontrada"); 186 | if(options.showLinks) jQuery(options.linksMenu).show(); 187 | fn.infinitScroll(); 188 | fn.scrollToTop(); 189 | return $this; 190 | } 191 | 192 | // Reporting Errors 193 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 194 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 195 | 196 | var currentUrl=document.location.href, 197 | linksMenuE=jQuery(options.linksMenu), 198 | prodOverlay=jQuery('
'), 199 | departamentE=jQuery(options.menuDepartament), 200 | loadContentOffset=loadContentE.offset(), 201 | pageNumber=1, 202 | shelfJqxhr=null, 203 | pageJqxhr=null; 204 | 205 | options.emptySearchElem.append(options.emptySearchMsg); 206 | loadContentE.before(prodOverlay); 207 | 208 | var fns= 209 | { 210 | exec:function() 211 | { 212 | fns.setFilterMenu(); 213 | fns.fildsetFormat(); 214 | $this.each(function(){ 215 | var _this=jQuery(this); 216 | 217 | if(_this.is(":checked")) 218 | urlFilters+="&"+(_this.attr("rel")||""); 219 | 220 | fns.adjustText(_this); 221 | filtersMenuE.css("visibility","visible"); 222 | 223 | _this.bind("change",function(){ 224 | fns.inputAction(); 225 | if(_this.is(":checked")) 226 | fns.addFilter(_this); 227 | else 228 | fns.removeFilter(_this); 229 | ajaxCallbackObj.filters=$this.filter(":checked").length; 230 | }); 231 | }); 232 | 233 | if(""!==urlFilters) 234 | fns.addFilter($empty); 235 | }, 236 | mergeMenu:function() 237 | { 238 | if(!options.mergeMenu) return false; 239 | 240 | var elem=departamentE; 241 | elem.insertAfter(options.insertMenuAfter); 242 | fns.departamentMenuFormat(elem); 243 | }, 244 | mergeMenuList:function() 245 | { 246 | var i=0; 247 | filtersMenuE.find("h3,h4").each(function(){ 248 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 249 | ul.insertAfter(jQuery(this)); 250 | fns.departamentMenuFormat(ul); 251 | i++; 252 | }); 253 | }, 254 | departamentMenuFormat:function(elem) 255 | { 256 | elem.find("a").each(function(){ 257 | var a=jQuery(this); 258 | a.text(fns.removeCounter(a.text())); 259 | }); 260 | }, 261 | fildsetFormat:function() 262 | { 263 | filtersMenuE.find("fieldset").each(function(){ 264 | var $t=jQuery(this), 265 | label=$t.find("label"); 266 | 267 | // Ocultar fieldset quando não existe filtro e sair desste método 268 | if(label.length<1) 269 | { 270 | $t.hide(); 271 | return false; 272 | } 273 | 274 | // Adicionar classe ao fieldset 275 | $t.addClass("filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-")); 276 | 277 | // Adicionando classe e título ao label 278 | label.each(function(){ 279 | var t=jQuery(this), 280 | v=(t.find("input").val()||""); 281 | t.addClass("sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-")).attr("title",v); 282 | }); 283 | }); 284 | }, 285 | inputAction:function() 286 | { 287 | if(null!==pageJqxhr) pageJqxhr.abort(); 288 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 289 | currentPage=2; 290 | moreResults=true; 291 | }, 292 | addFilter:function(input) 293 | { 294 | urlFilters+="&"+(input.attr("rel")||""); 295 | prodOverlay.fadeTo(300,0.6); 296 | currentSearchUrl=fn.getUrl(); 297 | shelfJqxhr=jQuery.ajax({ 298 | url:currentSearchUrl, 299 | success:fns.filterAjaxSuccess, 300 | error:fns.filterAjaxError 301 | }); 302 | // Adicionando classe ao label 303 | input.parent().addClass("sr_selected"); 304 | }, 305 | removeFilter:function(input) 306 | { 307 | var url=(input.attr("rel")||""); 308 | prodOverlay.fadeTo(300,0.6); 309 | if(url!=="") 310 | urlFilters=urlFilters.replace("&"+url,""); 311 | 312 | currentSearchUrl=fn.getUrl(); 313 | shelfJqxhr=jQuery.ajax({ 314 | url:currentSearchUrl, 315 | success:fns.filterAjaxSuccess, 316 | error:fns.filterAjaxError 317 | }); 318 | // Removendo classe do label 319 | input.parent().removeClass("sr_selected"); 320 | }, 321 | filterAjaxSuccess:function(data) 322 | { 323 | var $data=jQuery(data); 324 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 325 | fns.updateContent($data); 326 | ajaxCallbackObj.requests++; 327 | options.ajaxCallback(ajaxCallbackObj); 328 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 329 | }, 330 | filterAjaxError:function() 331 | { 332 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 333 | alert(options.filterErrorMsg); 334 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 335 | }, 336 | updateContent:function($data) 337 | { 338 | animatingFilter=true; 339 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 340 | 341 | var shelf=$data.filter(options.shelfClass); 342 | var shelfPage=loadContentE.find(options.shelfClass); 343 | 344 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 345 | jQuery(this).remove(); 346 | 347 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 348 | // corrigir um bug encontrado ao clicar em vários filtros 349 | if(options.usePopup) 350 | body.find(".boxPopUp2").vtexPopUp2(); 351 | else 352 | options.emptySearchElem.remove(); 353 | 354 | if(shelf.length>0) 355 | { 356 | shelf.hide(); 357 | loadContentE.append(shelf); 358 | shelf.slideDown(600,function(){animatingFilter=false;}); 359 | ajaxCallbackObj.isEmpty=false; 360 | } 361 | else 362 | { 363 | ajaxCallbackObj.isEmpty=true; 364 | 365 | if(options.usePopup) 366 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 367 | else 368 | { 369 | loadContentE.append(options.emptySearchElem); 370 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 371 | options.emptySearchElem.fadeTo(300,1); 372 | }); 373 | } 374 | 375 | options.emptySearchCallback(ajaxCallbackObj); 376 | } 377 | }); 378 | }, 379 | adjustText:function(input) 380 | { 381 | var label=input.parent(), 382 | text=label.text(); 383 | qtt=""; 384 | 385 | text=fns.removeCounter(text); 386 | 387 | label.text(text).prepend(input); 388 | }, 389 | removeCounter:function(text) 390 | { 391 | return text.replace(/\([0-9]+\)/ig,function(a){ 392 | qtt=a.replace(/\(|\)/,""); 393 | return ""; 394 | }); 395 | }, 396 | setFilterMenu:function() 397 | { 398 | if(filtersMenuE.length>0) 399 | { 400 | linksMenuE.hide(); 401 | filtersMenuE.show(); 402 | } 403 | } 404 | }; 405 | 406 | if(body.hasClass("departamento")) 407 | fns.mergeMenu(); 408 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 409 | fns.mergeMenuList(); 410 | 411 | fns.exec(); 412 | fn.infinitScroll(); 413 | fn.scrollToTop(); 414 | options.callback(); 415 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.4.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.4 7 | * @date 2012-04-27 8 | */ 9 | if("function"!==typeof(String.prototype.replaceSpecialChars)) String.prototype.replaceSpecialChars=function(){var _replace={"ç":"c","æ":"ae","œ":"oe","á":"a","é":"e","í":"i","ó":"o","ú":"u","à":"a","è":"e","ì":"i","ò":"o","ù":"u","ä":"a","ë":"e","ï":"i","ö":"o","ü":"u","ÿ":"y","â":"a","ê":"e","î":"i","ô":"o","û":"u","å":"a","ã":"a","ø":"o","õ":"o","u":"u","Á":"A","É":"E","Í":"I","Ó":"O","Ú":"U","Ê":"E","Ô":"O","Ü":"U","Ã":"A","Õ":"O","À":"A","Ç":"C"};return this.replace(/[à-ú]/g,function(a){if(typeof(_replace[a])!="undefined") return _replace[a]; return a;});}; 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | ajaxCallback:function(){}, 48 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | emptySearchCallback:function(){}, 51 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 52 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 53 | authorizeScroll:function(){return true;}, 54 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 55 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 56 | authorizeUpdate:function(){return true;} 57 | }; 58 | 59 | var options=jQuery.extend(defaults, opts), 60 | _console="object"===typeof(console), 61 | $empty=jQuery(""), 62 | elemLoading=jQuery(options.elemLoading), 63 | currentPage=2, 64 | moreResults=true, 65 | _window=jQuery(window), 66 | _document=jQuery(document), 67 | _html=jQuery("html,body"), 68 | body=jQuery("body"), 69 | currentSearchUrl="", 70 | urlFilters="", 71 | searchUrl="", 72 | animatingFilter=false, 73 | loadContentE=jQuery(options.loadContent), 74 | filtersMenuE=jQuery(options.filtersMenu), 75 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}; 76 | 77 | var fn= 78 | { 79 | getUrl:function(scroll) 80 | { 81 | var s=scroll||false; 82 | if(s) 83 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 84 | else 85 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 86 | }, 87 | getSearchUrl:function() 88 | { 89 | var url, content, preg; 90 | jQuery("script:not([src])").each(function(){ 91 | content=jQuery(this)[0].innerHTML; 92 | preg=/\/buscapagina\?.+&PageNumber=/i; 93 | if(content.search(/\/buscapagina\?/i)>-1) 94 | { 95 | url=preg.exec(content); 96 | return false; 97 | } 98 | }); 99 | 100 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 101 | return url[0]; 102 | else 103 | { 104 | if(_console) console.log("[Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 105 | return ""; 106 | } 107 | }, 108 | scrollToTop:function() 109 | { 110 | var elem=body.find("#returnToTop"); 111 | 112 | if(elem.length<1) 113 | { 114 | elem=jQuery(''); 115 | body.append(elem); 116 | } 117 | 118 | var windowH=_window.height(); 119 | _window.bind("resize",function(){ 120 | windowH=_window.height(); 121 | }); 122 | _window.bind("scroll",function(){ 123 | if(_window.scrollTop()>(windowH)) 124 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 125 | else 126 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 127 | }); 128 | elem.bind("click",function(){ 129 | _html.animate({scrollTop:0},"slow"); 130 | return false; 131 | }); 132 | }, 133 | infinitScroll:function() 134 | { 135 | var elementPages=body.find(".pager:first").attr("id"), 136 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 137 | currentStatus=true; 138 | 139 | // Reportando erros 140 | if("undefined"===typeof pages) console.log("[Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 141 | 142 | _window.bind('scroll',function(){ 143 | var _this=jQuery(this); 144 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 145 | { 146 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 147 | { 148 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 149 | currentItems.after(elemLoading); 150 | currentStatus=false; 151 | pageJqxhr=jQuery.ajax({ 152 | url: fn.getUrl(true), 153 | success:function(data) 154 | { 155 | if(data.trim().length<1) 156 | { 157 | moreResults=false; 158 | if(_console) console.log("[Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 159 | } 160 | else 161 | currentItems.after(data); 162 | currentStatus=true; 163 | elemLoading.remove(); 164 | ajaxCallbackObj.requests++; 165 | options.ajaxCallback(ajaxCallbackObj); 166 | } 167 | }); 168 | currentPage++; 169 | } 170 | } 171 | else 172 | return false; 173 | }); 174 | } 175 | } 176 | 177 | if(null!==options.searchUrl) 178 | currentSearchUrl=searchUrl=options.searchUrl; 179 | else 180 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 181 | 182 | // Reporting Errors 183 | if($this.length<1) 184 | { 185 | if(_console) console.log("[Aviso] Nenhuma opção de filtro encontrada"); 186 | if(options.showLinks) jQuery(options.linksMenu).show(); 187 | fn.infinitScroll(); 188 | fn.scrollToTop(); 189 | return $this; 190 | } 191 | 192 | // Reporting Errors 193 | if(loadContentE.length<1){if(_console) console.log("[Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 194 | if(filtersMenuE.length<1 && _console) console.log("[Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 195 | 196 | var currentUrl=document.location.href, 197 | linksMenuE=jQuery(options.linksMenu), 198 | prodOverlay=jQuery('
'), 199 | departamentE=jQuery(options.menuDepartament), 200 | loadContentOffset=loadContentE.offset(), 201 | pageNumber=1, 202 | shelfJqxhr=null, 203 | pageJqxhr=null; 204 | 205 | options.emptySearchElem.append(options.emptySearchMsg); 206 | loadContentE.before(prodOverlay); 207 | 208 | var fns= 209 | { 210 | exec:function() 211 | { 212 | fns.setFilterMenu(); 213 | fns.fildsetFormat(); 214 | $this.each(function(){ 215 | var _this=jQuery(this), 216 | label=_this.parent(); 217 | 218 | if(_this.is(":checked")) 219 | { 220 | urlFilters+="&"+(_this.attr("rel")||""); 221 | // Adicionando classe ao label 222 | label.addClass("sr_selected"); 223 | } 224 | 225 | fns.adjustText(_this); 226 | // Add span vazio (depois de executar de "adjustText") 227 | label.append(''); 228 | // Exibindo o menu 229 | filtersMenuE.css("visibility","visible"); 230 | 231 | _this.bind("change",function(){ 232 | fns.inputAction(); 233 | if(_this.is(":checked")) 234 | fns.addFilter(_this); 235 | else 236 | fns.removeFilter(_this); 237 | ajaxCallbackObj.filters=$this.filter(":checked").length; 238 | }); 239 | }); 240 | 241 | if(""!==urlFilters) 242 | fns.addFilter($empty); 243 | }, 244 | mergeMenu:function() 245 | { 246 | if(!options.mergeMenu) return false; 247 | 248 | var elem=departamentE; 249 | elem.insertAfter(options.insertMenuAfter); 250 | fns.departamentMenuFormat(elem); 251 | }, 252 | mergeMenuList:function() 253 | { 254 | var i=0; 255 | filtersMenuE.find("h3,h4").each(function(){ 256 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 257 | ul.insertAfter(jQuery(this)); 258 | fns.departamentMenuFormat(ul); 259 | i++; 260 | }); 261 | }, 262 | departamentMenuFormat:function(elem) 263 | { 264 | elem.find("a").each(function(){ 265 | var a=jQuery(this); 266 | a.text(fns.removeCounter(a.text())); 267 | }); 268 | }, 269 | fildsetFormat:function() 270 | { 271 | filtersMenuE.find("fieldset").each(function(){ 272 | var $t=jQuery(this), 273 | label=$t.find("label"); 274 | 275 | // Ocultar fieldset quando não existe filtro e sair desste método 276 | if(label.length<1) 277 | { 278 | $t.hide(); 279 | return; 280 | } 281 | 282 | // Adicionar classe ao fieldset 283 | $t.addClass("filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-")); 284 | 285 | // Adicionando classe e título ao label 286 | label.each(function(){ 287 | var t=jQuery(this), 288 | v=(t.find("input").val()||""); 289 | t.addClass("sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-")).attr("title",v); 290 | }); 291 | }); 292 | }, 293 | inputAction:function() 294 | { 295 | if(null!==pageJqxhr) pageJqxhr.abort(); 296 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 297 | currentPage=2; 298 | moreResults=true; 299 | }, 300 | addFilter:function(input) 301 | { 302 | urlFilters+="&"+(input.attr("rel")||""); 303 | prodOverlay.fadeTo(300,0.6); 304 | currentSearchUrl=fn.getUrl(); 305 | shelfJqxhr=jQuery.ajax({ 306 | url:currentSearchUrl, 307 | success:fns.filterAjaxSuccess, 308 | error:fns.filterAjaxError 309 | }); 310 | // Adicionando classe ao label 311 | input.parent().addClass("sr_selected"); 312 | }, 313 | removeFilter:function(input) 314 | { 315 | var url=(input.attr("rel")||""); 316 | prodOverlay.fadeTo(300,0.6); 317 | if(url!=="") 318 | urlFilters=urlFilters.replace("&"+url,""); 319 | 320 | currentSearchUrl=fn.getUrl(); 321 | shelfJqxhr=jQuery.ajax({ 322 | url:currentSearchUrl, 323 | success:fns.filterAjaxSuccess, 324 | error:fns.filterAjaxError 325 | }); 326 | // Removendo classe do label 327 | input.parent().removeClass("sr_selected"); 328 | }, 329 | filterAjaxSuccess:function(data) 330 | { 331 | var $data=jQuery(data); 332 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 333 | fns.updateContent($data); 334 | ajaxCallbackObj.requests++; 335 | options.ajaxCallback(ajaxCallbackObj); 336 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 337 | }, 338 | filterAjaxError:function() 339 | { 340 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 341 | alert(options.filterErrorMsg); 342 | if(_console) console.log("[Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 343 | }, 344 | updateContent:function($data) 345 | { 346 | animatingFilter=true; 347 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 348 | 349 | var shelf=$data.filter(options.shelfClass); 350 | var shelfPage=loadContentE.find(options.shelfClass); 351 | 352 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 353 | jQuery(this).remove(); 354 | 355 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 356 | // corrigir um bug encontrado ao clicar em vários filtros 357 | if(options.usePopup) 358 | body.find(".boxPopUp2").vtexPopUp2(); 359 | else 360 | options.emptySearchElem.remove(); 361 | 362 | if(shelf.length>0) 363 | { 364 | shelf.hide(); 365 | loadContentE.append(shelf); 366 | shelf.slideDown(600,function(){animatingFilter=false;}); 367 | ajaxCallbackObj.isEmpty=false; 368 | } 369 | else 370 | { 371 | ajaxCallbackObj.isEmpty=true; 372 | 373 | if(options.usePopup) 374 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 375 | else 376 | { 377 | loadContentE.append(options.emptySearchElem); 378 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 379 | options.emptySearchElem.fadeTo(300,1); 380 | }); 381 | } 382 | 383 | options.emptySearchCallback(ajaxCallbackObj); 384 | } 385 | }); 386 | }, 387 | adjustText:function(input) 388 | { 389 | var label=input.parent(), 390 | text=label.text(); 391 | qtt=""; 392 | 393 | text=fns.removeCounter(text); 394 | 395 | label.text(text).prepend(input); 396 | }, 397 | removeCounter:function(text) 398 | { 399 | return text.replace(/\([0-9]+\)/ig,function(a){ 400 | qtt=a.replace(/\(|\)/,""); 401 | return ""; 402 | }); 403 | }, 404 | setFilterMenu:function() 405 | { 406 | if(filtersMenuE.length>0) 407 | { 408 | linksMenuE.hide(); 409 | filtersMenuE.show(); 410 | } 411 | } 412 | }; 413 | 414 | if(body.hasClass("departamento")) 415 | fns.mergeMenu(); 416 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 417 | fns.mergeMenuList(); 418 | 419 | fns.exec(); 420 | fn.infinitScroll(); 421 | fn.scrollToTop(); 422 | options.callback(); 423 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.5.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.5 7 | * @date 2012-05-17 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | ajaxCallback:function(){}, 48 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | emptySearchCallback:function(){}, 51 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 52 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 53 | authorizeScroll:function(){return true;}, 54 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 55 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 56 | authorizeUpdate:function(){return true;}, 57 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 58 | labelCallback:function(data){} 59 | }; 60 | 61 | var options=jQuery.extend(defaults, opts), 62 | _console="object"===typeof(console), 63 | $empty=jQuery(""), 64 | elemLoading=jQuery(options.elemLoading), 65 | currentPage=2, 66 | moreResults=true, 67 | _window=jQuery(window), 68 | _document=jQuery(document), 69 | _html=jQuery("html,body"), 70 | body=jQuery("body"), 71 | currentSearchUrl="", 72 | urlFilters="", 73 | searchUrl="", 74 | animatingFilter=false, 75 | loadContentE=jQuery(options.loadContent), 76 | filtersMenuE=jQuery(options.filtersMenu), 77 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 78 | labelCallbackData={}; 79 | 80 | var fn= 81 | { 82 | getUrl:function(scroll) 83 | { 84 | var s=scroll||false; 85 | if(s) 86 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 87 | else 88 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 89 | }, 90 | getSearchUrl:function() 91 | { 92 | var url, content, preg; 93 | jQuery("script:not([src])").each(function(){ 94 | content=jQuery(this)[0].innerHTML; 95 | preg=/\/buscapagina\?.+&PageNumber=/i; 96 | if(content.search(/\/buscapagina\?/i)>-1) 97 | { 98 | url=preg.exec(content); 99 | return false; 100 | } 101 | }); 102 | 103 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 104 | return url[0]; 105 | else 106 | { 107 | if(_console) console.log("[Smart Research - Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 108 | return ""; 109 | } 110 | }, 111 | scrollToTop:function() 112 | { 113 | var elem=body.find("#returnToTop"); 114 | 115 | if(elem.length<1) 116 | { 117 | elem=jQuery(''); 118 | body.append(elem); 119 | } 120 | 121 | var windowH=_window.height(); 122 | _window.bind("resize",function(){ 123 | windowH=_window.height(); 124 | }); 125 | _window.bind("scroll",function(){ 126 | if(_window.scrollTop()>(windowH)) 127 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 128 | else 129 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 130 | }); 131 | elem.bind("click",function(){ 132 | _html.animate({scrollTop:0},"slow"); 133 | return false; 134 | }); 135 | }, 136 | infinitScroll:function() 137 | { 138 | var elementPages=body.find(".pager:first").attr("id"), 139 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 140 | currentStatus=true; 141 | 142 | // Reportando erros 143 | if("undefined"===typeof pages) console.log("[Smart Research - Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 144 | 145 | _window.bind('scroll',function(){ 146 | var _this=jQuery(this); 147 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 148 | { 149 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 150 | { 151 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 152 | currentItems.after(elemLoading); 153 | currentStatus=false; 154 | pageJqxhr=jQuery.ajax({ 155 | url: fn.getUrl(true), 156 | success:function(data) 157 | { 158 | if(data.trim().length<1) 159 | { 160 | moreResults=false; 161 | if(_console) console.log("[Smart Research - Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 162 | } 163 | else 164 | currentItems.after(data); 165 | currentStatus=true; 166 | elemLoading.remove(); 167 | ajaxCallbackObj.requests++; 168 | options.ajaxCallback(ajaxCallbackObj); 169 | } 170 | }); 171 | currentPage++; 172 | } 173 | } 174 | else 175 | return false; 176 | }); 177 | } 178 | } 179 | 180 | if(null!==options.searchUrl) 181 | currentSearchUrl=searchUrl=options.searchUrl; 182 | else 183 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 184 | 185 | // Reporting Errors 186 | if($this.length<1) 187 | { 188 | if(_console) console.log("[Smart Research - Aviso] Nenhuma opção de filtro encontrada"); 189 | if(options.showLinks) jQuery(options.linksMenu).show(); 190 | fn.infinitScroll(); 191 | fn.scrollToTop(); 192 | return $this; 193 | } 194 | 195 | // Reporting Errors 196 | if(loadContentE.length<1){if(_console) console.log("[Smart Research - Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 197 | if(filtersMenuE.length<1 && _console) console.log("[Smart Research - Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 198 | 199 | var currentUrl=document.location.href, 200 | linksMenuE=jQuery(options.linksMenu), 201 | prodOverlay=jQuery('
'), 202 | departamentE=jQuery(options.menuDepartament), 203 | loadContentOffset=loadContentE.offset(), 204 | pageNumber=1, 205 | shelfJqxhr=null, 206 | pageJqxhr=null; 207 | 208 | options.emptySearchElem.append(options.emptySearchMsg); 209 | loadContentE.before(prodOverlay); 210 | 211 | var fns= 212 | { 213 | exec:function() 214 | { 215 | fns.setFilterMenu(); 216 | fns.fieldsetFormat(); 217 | $this.each(function(){ 218 | var _this=jQuery(this), 219 | label=_this.parent(); 220 | 221 | if(_this.is(":checked")) 222 | { 223 | urlFilters+="&"+(_this.attr("rel")||""); 224 | // Adicionando classe ao label 225 | label.addClass("sr_selected"); 226 | } 227 | 228 | fns.adjustText(_this); 229 | // Add span vazio (depois de executar de "adjustText") 230 | label.append(''); 231 | 232 | _this.bind("change",function(){ 233 | fns.inputAction(); 234 | if(_this.is(":checked")) 235 | fns.addFilter(_this); 236 | else 237 | fns.removeFilter(_this); 238 | ajaxCallbackObj.filters=$this.filter(":checked").length; 239 | }); 240 | }); 241 | 242 | if(""!==urlFilters) 243 | fns.addFilter($empty); 244 | }, 245 | mergeMenu:function() 246 | { 247 | if(!options.mergeMenu) return false; 248 | 249 | var elem=departamentE; 250 | elem.insertAfter(options.insertMenuAfter); 251 | fns.departamentMenuFormat(elem); 252 | }, 253 | mergeMenuList:function() 254 | { 255 | var i=0; 256 | filtersMenuE.find("h3,h4").each(function(){ 257 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 258 | ul.insertAfter(jQuery(this)); 259 | fns.departamentMenuFormat(ul); 260 | i++; 261 | }); 262 | }, 263 | departamentMenuFormat:function(elem) 264 | { 265 | elem.find("a").each(function(){ 266 | var a=jQuery(this); 267 | a.text(fns.removeCounter(a.text())); 268 | }); 269 | }, 270 | fieldsetFormat:function() 271 | { 272 | labelCallbackData.fieldsetCount=0; 273 | labelCallbackData.tmpCurrentLabel={}; 274 | 275 | filtersMenuE.find("fieldset").each(function(){ 276 | var $t=jQuery(this), 277 | label=$t.find("label"), 278 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 279 | 280 | labelCallbackData[fieldsetClass]={}; 281 | 282 | // Ocultar fieldset quando não existe filtro e sair desste método 283 | if(label.length<1) 284 | { 285 | $t.hide(); 286 | return; 287 | } 288 | 289 | // Adicionar classe ao fieldset 290 | $t.addClass(fieldsetClass); 291 | 292 | // Adicionando classe e título ao label 293 | label.each(function(ndx){ 294 | var t=jQuery(this), 295 | v=(t.find("input").val()||""), 296 | labelClass="sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 297 | 298 | labelCallbackData.tmpCurrentLabel= 299 | { 300 | fieldsetParent:[$t,fieldsetClass], 301 | elem:t 302 | }; 303 | 304 | labelCallbackData[fieldsetClass][ndx.toString()]= 305 | { 306 | className:labelClass, 307 | title:v 308 | }; 309 | 310 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 311 | 312 | options.labelCallback(labelCallbackData); 313 | }); 314 | 315 | labelCallbackData.fieldsetCount++; 316 | }); 317 | }, 318 | inputAction:function() 319 | { 320 | if(null!==pageJqxhr) pageJqxhr.abort(); 321 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 322 | currentPage=2; 323 | moreResults=true; 324 | }, 325 | addFilter:function(input) 326 | { 327 | urlFilters+="&"+(input.attr("rel")||""); 328 | prodOverlay.fadeTo(300,0.6); 329 | currentSearchUrl=fn.getUrl(); 330 | shelfJqxhr=jQuery.ajax({ 331 | url:currentSearchUrl, 332 | success:fns.filterAjaxSuccess, 333 | error:fns.filterAjaxError 334 | }); 335 | // Adicionando classe ao label 336 | input.parent().addClass("sr_selected"); 337 | }, 338 | removeFilter:function(input) 339 | { 340 | var url=(input.attr("rel")||""); 341 | prodOverlay.fadeTo(300,0.6); 342 | if(url!=="") 343 | urlFilters=urlFilters.replace("&"+url,""); 344 | 345 | currentSearchUrl=fn.getUrl(); 346 | shelfJqxhr=jQuery.ajax({ 347 | url:currentSearchUrl, 348 | success:fns.filterAjaxSuccess, 349 | error:fns.filterAjaxError 350 | }); 351 | // Removendo classe do label 352 | input.parent().removeClass("sr_selected"); 353 | }, 354 | filterAjaxSuccess:function(data) 355 | { 356 | var $data=jQuery(data); 357 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 358 | fns.updateContent($data); 359 | ajaxCallbackObj.requests++; 360 | options.ajaxCallback(ajaxCallbackObj); 361 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 362 | }, 363 | filterAjaxError:function() 364 | { 365 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 366 | alert(options.filterErrorMsg); 367 | if(_console) console.log("[Smart Research - Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 368 | }, 369 | updateContent:function($data) 370 | { 371 | animatingFilter=true; 372 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 373 | 374 | var shelf=$data.filter(options.shelfClass); 375 | var shelfPage=loadContentE.find(options.shelfClass); 376 | 377 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 378 | jQuery(this).remove(); 379 | 380 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 381 | // corrigir um bug encontrado ao clicar em vários filtros 382 | if(options.usePopup) 383 | body.find(".boxPopUp2").vtexPopUp2(); 384 | else 385 | options.emptySearchElem.remove(); 386 | 387 | if(shelf.length>0) 388 | { 389 | shelf.hide(); 390 | loadContentE.append(shelf); 391 | shelf.slideDown(600,function(){animatingFilter=false;}); 392 | ajaxCallbackObj.isEmpty=false; 393 | } 394 | else 395 | { 396 | ajaxCallbackObj.isEmpty=true; 397 | 398 | if(options.usePopup) 399 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 400 | else 401 | { 402 | loadContentE.append(options.emptySearchElem); 403 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 404 | options.emptySearchElem.fadeTo(300,1); 405 | }); 406 | } 407 | 408 | options.emptySearchCallback(ajaxCallbackObj); 409 | } 410 | }); 411 | }, 412 | adjustText:function(input) 413 | { 414 | var label=input.parent(), 415 | text=label.text(); 416 | qtt=""; 417 | 418 | text=fns.removeCounter(text); 419 | 420 | label.text(text).prepend(input); 421 | }, 422 | removeCounter:function(text) 423 | { 424 | return text.replace(/\([0-9]+\)/ig,function(a){ 425 | qtt=a.replace(/\(|\)/,""); 426 | return ""; 427 | }); 428 | }, 429 | setFilterMenu:function() 430 | { 431 | if(filtersMenuE.length>0) 432 | { 433 | linksMenuE.hide(); 434 | filtersMenuE.show(); 435 | } 436 | } 437 | }; 438 | 439 | if(body.hasClass("departamento")) 440 | fns.mergeMenu(); 441 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 442 | fns.mergeMenuList(); 443 | 444 | fns.exec(); 445 | fn.infinitScroll(); 446 | fn.scrollToTop(); 447 | options.callback(); 448 | 449 | // Exibindo o menu 450 | filtersMenuE.css("visibility","visible"); 451 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.6.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.6 7 | * @date 2012-05-22 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 46 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 47 | ajaxCallback:function(){}, 48 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 49 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 50 | emptySearchCallback:function(){}, 51 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 52 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 53 | authorizeScroll:function(){return true;}, 54 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 55 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 56 | authorizeUpdate:function(){return true;}, 57 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 58 | labelCallback:function(data){} 59 | }; 60 | 61 | var options=jQuery.extend(defaults, opts), 62 | _console="object"===typeof(console), 63 | $empty=jQuery(""), 64 | elemLoading=jQuery(options.elemLoading), 65 | currentPage=2, 66 | moreResults=true, 67 | _window=jQuery(window), 68 | _document=jQuery(document), 69 | _html=jQuery("html,body"), 70 | body=jQuery("body"), 71 | currentSearchUrl="", 72 | urlFilters="", 73 | searchUrl="", 74 | animatingFilter=false, 75 | loadContentE=jQuery(options.loadContent), 76 | filtersMenuE=jQuery(options.filtersMenu), 77 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 78 | labelCallbackData={}; 79 | 80 | var fn= 81 | { 82 | getUrl:function(scroll) 83 | { 84 | var s=scroll||false; 85 | if(s) 86 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 87 | else 88 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 89 | }, 90 | getSearchUrl:function() 91 | { 92 | var url, content, preg; 93 | jQuery("script:not([src])").each(function(){ 94 | content=jQuery(this)[0].innerHTML; 95 | preg=/\/buscapagina\?.+&PageNumber=/i; 96 | if(content.search(/\/buscapagina\?/i)>-1) 97 | { 98 | url=preg.exec(content); 99 | return false; 100 | } 101 | }); 102 | 103 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 104 | return url[0]; 105 | else 106 | { 107 | if(_console) console.log("[Smart Research - Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 108 | return ""; 109 | } 110 | }, 111 | scrollToTop:function() 112 | { 113 | var elem=body.find("#returnToTop"); 114 | 115 | if(elem.length<1) 116 | { 117 | elem=jQuery(''); 118 | body.append(elem); 119 | } 120 | 121 | var windowH=_window.height(); 122 | _window.bind("resize",function(){ 123 | windowH=_window.height(); 124 | }); 125 | _window.bind("scroll",function(){ 126 | if(_window.scrollTop()>(windowH)) 127 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 128 | else 129 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 130 | }); 131 | elem.bind("click",function(){ 132 | _html.animate({scrollTop:0},"slow"); 133 | return false; 134 | }); 135 | }, 136 | infinitScroll:function() 137 | { 138 | var elementPages=body.find(".pager:first").attr("id"), 139 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 140 | currentStatus=true; 141 | 142 | // Reportando erros 143 | if("undefined"===typeof pages) console.log("[Smart Research - Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 144 | 145 | _window.bind('scroll',function(){ 146 | var _this=jQuery(this); 147 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 148 | { 149 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 150 | { 151 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 152 | currentItems.after(elemLoading); 153 | currentStatus=false; 154 | pageJqxhr=jQuery.ajax({ 155 | url: fn.getUrl(true), 156 | success:function(data) 157 | { 158 | if(data.trim().length<1) 159 | { 160 | moreResults=false; 161 | if(_console) console.log("[Smart Research - Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 162 | } 163 | else 164 | currentItems.after(data); 165 | currentStatus=true; 166 | elemLoading.remove(); 167 | ajaxCallbackObj.requests++; 168 | options.ajaxCallback(ajaxCallbackObj); 169 | } 170 | }); 171 | currentPage++; 172 | } 173 | } 174 | else 175 | return false; 176 | }); 177 | } 178 | } 179 | 180 | if(null!==options.searchUrl) 181 | currentSearchUrl=searchUrl=options.searchUrl; 182 | else 183 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 184 | 185 | // Reporting Errors 186 | if($this.length<1) 187 | { 188 | if(_console) console.log("[Smart Research - Aviso] Nenhuma opção de filtro encontrada"); 189 | if(options.showLinks) jQuery(options.linksMenu).css("visibility","visible").show(); 190 | fn.infinitScroll(); 191 | fn.scrollToTop(); 192 | return $this; 193 | } 194 | 195 | // Reporting Errors 196 | if(loadContentE.length<1){if(_console) console.log("[Smart Research - Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 197 | if(filtersMenuE.length<1 && _console) console.log("[Smart Research - Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 198 | 199 | var currentUrl=document.location.href, 200 | linksMenuE=jQuery(options.linksMenu), 201 | prodOverlay=jQuery('
'), 202 | departamentE=jQuery(options.menuDepartament), 203 | loadContentOffset=loadContentE.offset(), 204 | pageNumber=1, 205 | shelfJqxhr=null, 206 | pageJqxhr=null; 207 | 208 | options.emptySearchElem.append(options.emptySearchMsg); 209 | loadContentE.before(prodOverlay); 210 | 211 | var fns= 212 | { 213 | exec:function() 214 | { 215 | fns.setFilterMenu(); 216 | fns.fieldsetFormat(); 217 | $this.each(function(){ 218 | var _this=jQuery(this), 219 | label=_this.parent(); 220 | 221 | if(_this.is(":checked")) 222 | { 223 | urlFilters+="&"+(_this.attr("rel")||""); 224 | // Adicionando classe ao label 225 | label.addClass("sr_selected"); 226 | } 227 | 228 | fns.adjustText(_this); 229 | // Add span vazio (depois de executar de "adjustText") 230 | label.append(''); 231 | 232 | _this.bind("change",function(){ 233 | fns.inputAction(); 234 | if(_this.is(":checked")) 235 | fns.addFilter(_this); 236 | else 237 | fns.removeFilter(_this); 238 | ajaxCallbackObj.filters=$this.filter(":checked").length; 239 | }); 240 | }); 241 | 242 | if(""!==urlFilters) 243 | fns.addFilter($empty); 244 | }, 245 | mergeMenu:function() 246 | { 247 | if(!options.mergeMenu) return false; 248 | 249 | var elem=departamentE; 250 | elem.insertAfter(options.insertMenuAfter); 251 | fns.departamentMenuFormat(elem); 252 | }, 253 | mergeMenuList:function() 254 | { 255 | var i=0; 256 | filtersMenuE.find("h3,h4").each(function(){ 257 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 258 | ul.insertAfter(jQuery(this)); 259 | fns.departamentMenuFormat(ul); 260 | i++; 261 | }); 262 | }, 263 | departamentMenuFormat:function(elem) 264 | { 265 | elem.find("a").each(function(){ 266 | var a=jQuery(this); 267 | a.text(fns.removeCounter(a.text())); 268 | }); 269 | }, 270 | fieldsetFormat:function() 271 | { 272 | labelCallbackData.fieldsetCount=0; 273 | labelCallbackData.tmpCurrentLabel={}; 274 | 275 | filtersMenuE.find("fieldset").each(function(){ 276 | var $t=jQuery(this), 277 | label=$t.find("label"), 278 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 279 | 280 | labelCallbackData[fieldsetClass]={}; 281 | 282 | // Ocultar fieldset quando não existe filtro e sair desste método 283 | if(label.length<1) 284 | { 285 | $t.hide(); 286 | return; 287 | } 288 | 289 | // Adicionar classe ao fieldset 290 | $t.addClass(fieldsetClass); 291 | 292 | // Adicionando classe e título ao label 293 | label.each(function(ndx){ 294 | var t=jQuery(this), 295 | v=(t.find("input").val()||""), 296 | labelClass="sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 297 | 298 | labelCallbackData.tmpCurrentLabel= 299 | { 300 | fieldsetParent:[$t,fieldsetClass], 301 | elem:t 302 | }; 303 | 304 | labelCallbackData[fieldsetClass][ndx.toString()]= 305 | { 306 | className:labelClass, 307 | title:v 308 | }; 309 | 310 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 311 | 312 | options.labelCallback(labelCallbackData); 313 | }); 314 | 315 | labelCallbackData.fieldsetCount++; 316 | }); 317 | }, 318 | inputAction:function() 319 | { 320 | if(null!==pageJqxhr) pageJqxhr.abort(); 321 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 322 | currentPage=2; 323 | moreResults=true; 324 | }, 325 | addFilter:function(input) 326 | { 327 | urlFilters+="&"+(input.attr("rel")||""); 328 | prodOverlay.fadeTo(300,0.6); 329 | currentSearchUrl=fn.getUrl(); 330 | shelfJqxhr=jQuery.ajax({ 331 | url:currentSearchUrl, 332 | success:fns.filterAjaxSuccess, 333 | error:fns.filterAjaxError 334 | }); 335 | // Adicionando classe ao label 336 | input.parent().addClass("sr_selected"); 337 | }, 338 | removeFilter:function(input) 339 | { 340 | var url=(input.attr("rel")||""); 341 | prodOverlay.fadeTo(300,0.6); 342 | if(url!=="") 343 | urlFilters=urlFilters.replace("&"+url,""); 344 | 345 | currentSearchUrl=fn.getUrl(); 346 | shelfJqxhr=jQuery.ajax({ 347 | url:currentSearchUrl, 348 | success:fns.filterAjaxSuccess, 349 | error:fns.filterAjaxError 350 | }); 351 | // Removendo classe do label 352 | input.parent().removeClass("sr_selected"); 353 | }, 354 | filterAjaxSuccess:function(data) 355 | { 356 | var $data=jQuery(data); 357 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 358 | fns.updateContent($data); 359 | ajaxCallbackObj.requests++; 360 | options.ajaxCallback(ajaxCallbackObj); 361 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 362 | }, 363 | filterAjaxError:function() 364 | { 365 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 366 | alert(options.filterErrorMsg); 367 | if(_console) console.log("[Smart Research - Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 368 | }, 369 | updateContent:function($data) 370 | { 371 | animatingFilter=true; 372 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 373 | 374 | var shelf=$data.filter(options.shelfClass); 375 | var shelfPage=loadContentE.find(options.shelfClass); 376 | 377 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 378 | jQuery(this).remove(); 379 | 380 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 381 | // corrigir um bug encontrado ao clicar em vários filtros 382 | if(options.usePopup) 383 | body.find(".boxPopUp2").vtexPopUp2(); 384 | else 385 | options.emptySearchElem.remove(); 386 | 387 | if(shelf.length>0) 388 | { 389 | shelf.hide(); 390 | loadContentE.append(shelf); 391 | shelf.slideDown(600,function(){animatingFilter=false;}); 392 | ajaxCallbackObj.isEmpty=false; 393 | } 394 | else 395 | { 396 | ajaxCallbackObj.isEmpty=true; 397 | 398 | if(options.usePopup) 399 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 400 | else 401 | { 402 | loadContentE.append(options.emptySearchElem); 403 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 404 | options.emptySearchElem.fadeTo(300,1); 405 | }); 406 | } 407 | 408 | options.emptySearchCallback(ajaxCallbackObj); 409 | } 410 | }); 411 | }, 412 | adjustText:function(input) 413 | { 414 | var label=input.parent(), 415 | text=label.text(); 416 | qtt=""; 417 | 418 | text=fns.removeCounter(text); 419 | 420 | label.text(text).prepend(input); 421 | }, 422 | removeCounter:function(text) 423 | { 424 | return text.replace(/\([0-9]+\)/ig,function(a){ 425 | qtt=a.replace(/\(|\)/,""); 426 | return ""; 427 | }); 428 | }, 429 | setFilterMenu:function() 430 | { 431 | if(filtersMenuE.length>0) 432 | { 433 | linksMenuE.hide(); 434 | filtersMenuE.show(); 435 | } 436 | } 437 | }; 438 | 439 | if(body.hasClass("departamento")) 440 | fns.mergeMenu(); 441 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 442 | fns.mergeMenuList(); 443 | 444 | fns.exec(); 445 | fn.infinitScroll(); 446 | fn.scrollToTop(); 447 | options.callback(); 448 | 449 | // Exibindo o menu 450 | filtersMenuE.css("visibility","visible"); 451 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.7.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.7 7 | * @date 2012-05-25 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var defaults= 16 | { 17 | pageLimit:null, // Número máximo de páginas (limite da paginação) 18 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 19 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 20 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 21 | linksMenu:".search-single-navigator", // Menu de links 22 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 23 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 24 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 25 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 26 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 27 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 28 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 29 | searchUrl:null, // Url da página de busca (opicional) 30 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 31 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 32 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 33 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 34 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 35 | filterScrollTop:function(shelfOffset) 36 | { 37 | return (shelfOffset.top-20); 38 | }, 39 | callback:function(){}, 40 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 41 | getShelfHeight:function(container) 42 | { 43 | return (container.scrollTop()+container.height()); 44 | }, 45 | // Callback após inserir a prateleira na página 46 | shelfCallback:function(){}, 47 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 48 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 49 | ajaxCallback:function(){}, 50 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 51 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 52 | emptySearchCallback:function(){}, 53 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 54 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 55 | authorizeScroll:function(){return true;}, 56 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 57 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 58 | authorizeUpdate:function(){return true;}, 59 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 60 | labelCallback:function(data){} 61 | }; 62 | 63 | var options=jQuery.extend(defaults, opts), 64 | _console="object"===typeof(console), 65 | $empty=jQuery(""), 66 | elemLoading=jQuery(options.elemLoading), 67 | currentPage=2, 68 | moreResults=true, 69 | _window=jQuery(window), 70 | _document=jQuery(document), 71 | _html=jQuery("html,body"), 72 | body=jQuery("body"), 73 | currentSearchUrl="", 74 | urlFilters="", 75 | searchUrl="", 76 | animatingFilter=false, 77 | loadContentE=jQuery(options.loadContent), 78 | filtersMenuE=jQuery(options.filtersMenu), 79 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 80 | labelCallbackData={}; 81 | 82 | var fn= 83 | { 84 | getUrl:function(scroll) 85 | { 86 | var s=scroll||false; 87 | if(s) 88 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 89 | else 90 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 91 | }, 92 | getSearchUrl:function() 93 | { 94 | var url, content, preg; 95 | jQuery("script:not([src])").each(function(){ 96 | content=jQuery(this)[0].innerHTML; 97 | preg=/\/buscapagina\?.+&PageNumber=/i; 98 | if(content.search(/\/buscapagina\?/i)>-1) 99 | { 100 | url=preg.exec(content); 101 | return false; 102 | } 103 | }); 104 | 105 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 106 | return url[0]; 107 | else 108 | { 109 | if(_console) console.log("[Smart Research - Erro] Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 110 | return ""; 111 | } 112 | }, 113 | scrollToTop:function() 114 | { 115 | var elem=body.find("#returnToTop"); 116 | 117 | if(elem.length<1) 118 | { 119 | elem=jQuery(''); 120 | body.append(elem); 121 | } 122 | 123 | var windowH=_window.height(); 124 | _window.bind("resize",function(){ 125 | windowH=_window.height(); 126 | }); 127 | _window.bind("scroll",function(){ 128 | if(_window.scrollTop()>(windowH)) 129 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 130 | else 131 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 132 | }); 133 | elem.bind("click",function(){ 134 | _html.animate({scrollTop:0},"slow"); 135 | return false; 136 | }); 137 | }, 138 | infinitScroll:function() 139 | { 140 | var elementPages=body.find(".pager:first").attr("id"), 141 | pages=(null!==options.pageLimit)?options.pageLimit:eval("pagecount_"+elementPages.split("_").pop()), 142 | currentStatus=true; 143 | 144 | // Reportando erros 145 | if("undefined"===typeof pages) console.log("[Smart Research - Erro] Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 146 | 147 | _window.bind('scroll',function(){ 148 | var _this=jQuery(this); 149 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 150 | { 151 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 152 | { 153 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 154 | currentItems.after(elemLoading); 155 | currentStatus=false; 156 | pageJqxhr=jQuery.ajax({ 157 | url: fn.getUrl(true), 158 | success:function(data) 159 | { 160 | if(data.trim().length<1) 161 | { 162 | moreResults=false; 163 | if(_console) console.log("[Smart Research - Aviso] Não existem mais resultados a partir da página: "+(currentPage-1)); 164 | } 165 | else 166 | currentItems.after(data); 167 | currentStatus=true; 168 | elemLoading.remove(); 169 | ajaxCallbackObj.requests++; 170 | options.ajaxCallback(ajaxCallbackObj); 171 | } 172 | }); 173 | currentPage++; 174 | } 175 | } 176 | else 177 | return false; 178 | }); 179 | } 180 | } 181 | 182 | if(null!==options.searchUrl) 183 | currentSearchUrl=searchUrl=options.searchUrl; 184 | else 185 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 186 | 187 | // Reporting Errors 188 | if($this.length<1) 189 | { 190 | if(_console) console.log("[Smart Research - Aviso] Nenhuma opção de filtro encontrada"); 191 | if(options.showLinks) jQuery(options.linksMenu).css("visibility","visible").show(); 192 | fn.infinitScroll(); 193 | fn.scrollToTop(); 194 | return $this; 195 | } 196 | 197 | // Reporting Errors 198 | if(loadContentE.length<1){if(_console) console.log("[Smart Research - Erro] Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 199 | if(filtersMenuE.length<1 && _console) console.log("[Smart Research - Erro] O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 200 | 201 | var currentUrl=document.location.href, 202 | linksMenuE=jQuery(options.linksMenu), 203 | prodOverlay=jQuery('
'), 204 | departamentE=jQuery(options.menuDepartament), 205 | loadContentOffset=loadContentE.offset(), 206 | pageNumber=1, 207 | shelfJqxhr=null, 208 | pageJqxhr=null; 209 | 210 | options.emptySearchElem.append(options.emptySearchMsg); 211 | loadContentE.before(prodOverlay); 212 | 213 | var fns= 214 | { 215 | exec:function() 216 | { 217 | fns.setFilterMenu(); 218 | fns.fieldsetFormat(); 219 | $this.each(function(){ 220 | var _this=jQuery(this), 221 | label=_this.parent(); 222 | 223 | if(_this.is(":checked")) 224 | { 225 | urlFilters+="&"+(_this.attr("rel")||""); 226 | // Adicionando classe ao label 227 | label.addClass("sr_selected"); 228 | } 229 | 230 | fns.adjustText(_this); 231 | // Add span vazio (depois de executar de "adjustText") 232 | label.append(''); 233 | 234 | _this.bind("change",function(){ 235 | fns.inputAction(); 236 | if(_this.is(":checked")) 237 | fns.addFilter(_this); 238 | else 239 | fns.removeFilter(_this); 240 | ajaxCallbackObj.filters=$this.filter(":checked").length; 241 | }); 242 | }); 243 | 244 | if(""!==urlFilters) 245 | fns.addFilter($empty); 246 | }, 247 | mergeMenu:function() 248 | { 249 | if(!options.mergeMenu) return false; 250 | 251 | var elem=departamentE; 252 | elem.insertAfter(options.insertMenuAfter); 253 | fns.departamentMenuFormat(elem); 254 | }, 255 | mergeMenuList:function() 256 | { 257 | var i=0; 258 | filtersMenuE.find("h3,h4").each(function(){ 259 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 260 | ul.insertAfter(jQuery(this)); 261 | fns.departamentMenuFormat(ul); 262 | i++; 263 | }); 264 | }, 265 | departamentMenuFormat:function(elem) 266 | { 267 | elem.find("a").each(function(){ 268 | var a=jQuery(this); 269 | a.text(fns.removeCounter(a.text())); 270 | }); 271 | }, 272 | fieldsetFormat:function() 273 | { 274 | labelCallbackData.fieldsetCount=0; 275 | labelCallbackData.tmpCurrentLabel={}; 276 | 277 | filtersMenuE.find("fieldset").each(function(){ 278 | var $t=jQuery(this), 279 | label=$t.find("label"), 280 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 281 | 282 | labelCallbackData[fieldsetClass]={}; 283 | 284 | // Ocultar fieldset quando não existe filtro e sair desste método 285 | if(label.length<1) 286 | { 287 | $t.hide(); 288 | return; 289 | } 290 | 291 | // Adicionar classe ao fieldset 292 | $t.addClass(fieldsetClass); 293 | 294 | // Adicionando classe e título ao label 295 | label.each(function(ndx){ 296 | var t=jQuery(this), 297 | v=(t.find("input").val()||""), 298 | labelClass="sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 299 | 300 | labelCallbackData.tmpCurrentLabel= 301 | { 302 | fieldsetParent:[$t,fieldsetClass], 303 | elem:t 304 | }; 305 | 306 | labelCallbackData[fieldsetClass][ndx.toString()]= 307 | { 308 | className:labelClass, 309 | title:v 310 | }; 311 | 312 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 313 | 314 | options.labelCallback(labelCallbackData); 315 | }); 316 | 317 | labelCallbackData.fieldsetCount++; 318 | }); 319 | }, 320 | inputAction:function() 321 | { 322 | if(null!==pageJqxhr) pageJqxhr.abort(); 323 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 324 | currentPage=2; 325 | moreResults=true; 326 | }, 327 | addFilter:function(input) 328 | { 329 | urlFilters+="&"+(input.attr("rel")||""); 330 | prodOverlay.fadeTo(300,0.6); 331 | currentSearchUrl=fn.getUrl(); 332 | shelfJqxhr=jQuery.ajax({ 333 | url:currentSearchUrl, 334 | success:fns.filterAjaxSuccess, 335 | error:fns.filterAjaxError 336 | }); 337 | // Adicionando classe ao label 338 | input.parent().addClass("sr_selected"); 339 | }, 340 | removeFilter:function(input) 341 | { 342 | var url=(input.attr("rel")||""); 343 | prodOverlay.fadeTo(300,0.6); 344 | if(url!=="") 345 | urlFilters=urlFilters.replace("&"+url,""); 346 | 347 | currentSearchUrl=fn.getUrl(); 348 | shelfJqxhr=jQuery.ajax({ 349 | url:currentSearchUrl, 350 | success:fns.filterAjaxSuccess, 351 | error:fns.filterAjaxError 352 | }); 353 | // Removendo classe do label 354 | input.parent().removeClass("sr_selected"); 355 | }, 356 | filterAjaxSuccess:function(data) 357 | { 358 | var $data=jQuery(data); 359 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 360 | fns.updateContent($data); 361 | ajaxCallbackObj.requests++; 362 | options.ajaxCallback(ajaxCallbackObj); 363 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 364 | }, 365 | filterAjaxError:function() 366 | { 367 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 368 | alert(options.filterErrorMsg); 369 | if(_console) console.log("[Smart Research - Erro] Houve um erro ao tentar fazer a requisição da página com filtros."); 370 | }, 371 | updateContent:function($data) 372 | { 373 | animatingFilter=true; 374 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 375 | 376 | var shelf=$data.filter(options.shelfClass); 377 | var shelfPage=loadContentE.find(options.shelfClass); 378 | 379 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 380 | jQuery(this).remove(); 381 | 382 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 383 | // corrigir um bug encontrado ao clicar em vários filtros 384 | if(options.usePopup) 385 | body.find(".boxPopUp2").vtexPopUp2(); 386 | else 387 | options.emptySearchElem.remove(); 388 | 389 | if(shelf.length>0) 390 | { 391 | shelf.hide(); 392 | loadContentE.append(shelf); 393 | options.shelfCallback(); 394 | shelf.slideDown(600,function(){ 395 | animatingFilter=false; 396 | }); 397 | ajaxCallbackObj.isEmpty=false; 398 | } 399 | else 400 | { 401 | ajaxCallbackObj.isEmpty=true; 402 | 403 | if(options.usePopup) 404 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 405 | else 406 | { 407 | loadContentE.append(options.emptySearchElem); 408 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 409 | options.emptySearchElem.fadeTo(300,1); 410 | }); 411 | } 412 | 413 | options.emptySearchCallback(ajaxCallbackObj); 414 | } 415 | }); 416 | }, 417 | adjustText:function(input) 418 | { 419 | var label=input.parent(), 420 | text=label.text(); 421 | qtt=""; 422 | 423 | text=fns.removeCounter(text); 424 | 425 | label.text(text).prepend(input); 426 | }, 427 | removeCounter:function(text) 428 | { 429 | return text.replace(/\([0-9]+\)/ig,function(a){ 430 | qtt=a.replace(/\(|\)/,""); 431 | return ""; 432 | }); 433 | }, 434 | setFilterMenu:function() 435 | { 436 | if(filtersMenuE.length>0) 437 | { 438 | linksMenuE.hide(); 439 | filtersMenuE.show(); 440 | } 441 | } 442 | }; 443 | 444 | if(body.hasClass("departamento")) 445 | fns.mergeMenu(); 446 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 447 | fns.mergeMenuList(); 448 | 449 | fns.exec(); 450 | fn.infinitScroll(); 451 | fn.scrollToTop(); 452 | options.callback(); 453 | 454 | // Exibindo o menu 455 | filtersMenuE.css("visibility","visible"); 456 | }; -------------------------------------------------------------------------------- /old/vtex-smartResearch.V.3.8.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @author Edson Domingos Júnior 6 | * @version 3.8 7 | * @date 2012-10-01 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | $this=jQuery(this); 14 | 15 | var log=function(msg,type){ 16 | if(typeof console=="object") 17 | console.log("[Smart Research - "+(type||"Erro")+"] "+msg); 18 | }; 19 | 20 | var defaults= 21 | { 22 | pageLimit:null, // Número máximo de páginas (limite da paginação) 23 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 24 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 25 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 26 | linksMenu:".search-single-navigator", // Menu de links 27 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 28 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 29 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 30 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 31 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 32 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 33 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 34 | searchUrl:null, // Url da página de busca (opicional) 35 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 36 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 37 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 38 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 39 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 40 | filterScrollTop:function(shelfOffset) 41 | { 42 | return (shelfOffset.top-20); 43 | }, 44 | callback:function(){}, 45 | // Cálculo do tamanho do footer para que uam nova página seja chamada antes do usuário chegar ao "final" do site 46 | getShelfHeight:function(container) 47 | { 48 | return (container.scrollTop()+container.height()); 49 | }, 50 | // Callback após inserir a prateleira na página 51 | shelfCallback:function(){}, 52 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 53 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 54 | ajaxCallback:function(){}, 55 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 56 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 57 | emptySearchCallback:function(){}, 58 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 59 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 60 | authorizeScroll:function(){return true;}, 61 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 62 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 63 | authorizeUpdate:function(){return true;}, 64 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 65 | labelCallback:function(data){} 66 | }; 67 | 68 | var options=jQuery.extend(defaults, opts), 69 | _console="object"===typeof(console), 70 | $empty=jQuery(""), 71 | elemLoading=jQuery(options.elemLoading), 72 | currentPage=2, 73 | moreResults=true, 74 | _window=jQuery(window), 75 | _document=jQuery(document), 76 | _html=jQuery("html,body"), 77 | body=jQuery("body"), 78 | currentSearchUrl="", 79 | urlFilters="", 80 | searchUrl="", 81 | animatingFilter=false, 82 | loadContentE=jQuery(options.loadContent), 83 | filtersMenuE=jQuery(options.filtersMenu), 84 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 85 | labelCallbackData={}; 86 | 87 | var fn= 88 | { 89 | getUrl:function(scroll) 90 | { 91 | var s=scroll||false; 92 | if(s) 93 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 94 | else 95 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 96 | }, 97 | getSearchUrl:function() 98 | { 99 | var url, content, preg; 100 | jQuery("script:not([src])").each(function(){ 101 | content=jQuery(this)[0].innerHTML; 102 | preg=/\/buscapagina\?.+&PageNumber=/i; 103 | if(content.search(/\/buscapagina\?/i)>-1) 104 | { 105 | url=preg.exec(content); 106 | return false; 107 | } 108 | }); 109 | 110 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 111 | return url[0]; 112 | else 113 | { 114 | log("Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 115 | return ""; 116 | } 117 | }, 118 | scrollToTop:function() 119 | { 120 | var elem=body.find("#returnToTop"); 121 | 122 | if(elem.length<1) 123 | { 124 | elem=jQuery(''); 125 | body.append(elem); 126 | } 127 | 128 | var windowH=_window.height(); 129 | _window.bind("resize",function(){ 130 | windowH=_window.height(); 131 | }); 132 | _window.bind("scroll",function(){ 133 | if(_window.scrollTop()>(windowH)) 134 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 135 | else 136 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 137 | }); 138 | elem.bind("click",function(){ 139 | _html.animate({scrollTop:0},"slow"); 140 | return false; 141 | }); 142 | }, 143 | infinitScroll:function() 144 | { 145 | var elementPages,pages,currentStatus,tmp; 146 | 147 | elementPages=body.find(".pager:first").attr("id"); 148 | tmp=elementPages.split("_").pop(); 149 | pages=(null!==options.pageLimit)?options.pageLimit:window["pagecount_"+tmp]; 150 | currentStatus=true; 151 | 152 | // Reportando erros 153 | // if("undefined"===typeof pages) log("Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 154 | 155 | if("undefined"===typeof pages) 156 | pages=99999999; 157 | 158 | _window.bind('scroll',function(){ 159 | var _this=jQuery(this); 160 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 161 | { 162 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 163 | { 164 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 165 | currentItems.after(elemLoading); 166 | currentStatus=false; 167 | pageJqxhr=jQuery.ajax({ 168 | url: fn.getUrl(true), 169 | success:function(data) 170 | { 171 | if(data.trim().length<1) 172 | { 173 | moreResults=false; 174 | log("Não existem mais resultados a partir da página: "+(currentPage-1),"Aviso"); 175 | } 176 | else 177 | currentItems.after(data); 178 | currentStatus=true; 179 | elemLoading.remove(); 180 | ajaxCallbackObj.requests++; 181 | options.ajaxCallback(ajaxCallbackObj); 182 | } 183 | }); 184 | currentPage++; 185 | } 186 | } 187 | else 188 | return false; 189 | }); 190 | } 191 | } 192 | 193 | if(null!==options.searchUrl) 194 | currentSearchUrl=searchUrl=options.searchUrl; 195 | else 196 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 197 | 198 | // Reporting Errors 199 | if($this.length<1) 200 | { 201 | log("Nenhuma opção de filtro encontrada","Aviso"); 202 | if(options.showLinks) jQuery(options.linksMenu).css("visibility","visible").show(); 203 | fn.infinitScroll(); 204 | fn.scrollToTop(); 205 | return $this; 206 | } 207 | 208 | // Reporting Errors 209 | if(loadContentE.length<1){log("Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 210 | if(filtersMenuE.length<1) log("O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 211 | 212 | var currentUrl=document.location.href, 213 | linksMenuE=jQuery(options.linksMenu), 214 | prodOverlay=jQuery('
'), 215 | departamentE=jQuery(options.menuDepartament), 216 | loadContentOffset=loadContentE.offset(), 217 | pageNumber=1, 218 | shelfJqxhr=null, 219 | pageJqxhr=null; 220 | 221 | options.emptySearchElem.append(options.emptySearchMsg); 222 | loadContentE.before(prodOverlay); 223 | 224 | var fns= 225 | { 226 | exec:function() 227 | { 228 | fns.setFilterMenu(); 229 | fns.fieldsetFormat(); 230 | $this.each(function(){ 231 | var _this=jQuery(this), 232 | label=_this.parent(); 233 | 234 | if(_this.is(":checked")) 235 | { 236 | urlFilters+="&"+(_this.attr("rel")||""); 237 | // Adicionando classe ao label 238 | label.addClass("sr_selected"); 239 | } 240 | 241 | fns.adjustText(_this); 242 | // Add span vazio (depois de executar de "adjustText") 243 | label.append(''); 244 | 245 | _this.bind("change",function(){ 246 | fns.inputAction(); 247 | if(_this.is(":checked")) 248 | fns.addFilter(_this); 249 | else 250 | fns.removeFilter(_this); 251 | ajaxCallbackObj.filters=$this.filter(":checked").length; 252 | }); 253 | }); 254 | 255 | if(""!==urlFilters) 256 | fns.addFilter($empty); 257 | }, 258 | mergeMenu:function() 259 | { 260 | if(!options.mergeMenu) return false; 261 | 262 | var elem=departamentE; 263 | elem.insertAfter(options.insertMenuAfter); 264 | fns.departamentMenuFormat(elem); 265 | }, 266 | mergeMenuList:function() 267 | { 268 | var i=0; 269 | filtersMenuE.find("h3,h4").each(function(){ 270 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 271 | ul.insertAfter(jQuery(this)); 272 | fns.departamentMenuFormat(ul); 273 | i++; 274 | }); 275 | }, 276 | departamentMenuFormat:function(elem) 277 | { 278 | elem.find("a").each(function(){ 279 | var a=jQuery(this); 280 | a.text(fns.removeCounter(a.text())); 281 | }); 282 | }, 283 | fieldsetFormat:function() 284 | { 285 | labelCallbackData.fieldsetCount=0; 286 | labelCallbackData.tmpCurrentLabel={}; 287 | 288 | filtersMenuE.find("fieldset").each(function(){ 289 | var $t=jQuery(this), 290 | label=$t.find("label"), 291 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 292 | 293 | labelCallbackData[fieldsetClass]={}; 294 | 295 | // Ocultar fieldset quando não existe filtro e sair desste método 296 | if(label.length<1) 297 | { 298 | $t.hide(); 299 | return; 300 | } 301 | 302 | // Adicionar classe ao fieldset 303 | $t.addClass(fieldsetClass); 304 | 305 | // Adicionando classe e título ao label 306 | label.each(function(ndx){ 307 | var t=jQuery(this), 308 | v=(t.find("input").val()||""), 309 | labelClass="sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 310 | 311 | labelCallbackData.tmpCurrentLabel= 312 | { 313 | fieldsetParent:[$t,fieldsetClass], 314 | elem:t 315 | }; 316 | 317 | labelCallbackData[fieldsetClass][ndx.toString()]= 318 | { 319 | className:labelClass, 320 | title:v 321 | }; 322 | 323 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 324 | 325 | options.labelCallback(labelCallbackData); 326 | }); 327 | 328 | labelCallbackData.fieldsetCount++; 329 | }); 330 | }, 331 | inputAction:function() 332 | { 333 | if(null!==pageJqxhr) pageJqxhr.abort(); 334 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 335 | currentPage=2; 336 | moreResults=true; 337 | }, 338 | addFilter:function(input) 339 | { 340 | urlFilters+="&"+(input.attr("rel")||""); 341 | prodOverlay.fadeTo(300,0.6); 342 | currentSearchUrl=fn.getUrl(); 343 | shelfJqxhr=jQuery.ajax({ 344 | url:currentSearchUrl, 345 | success:fns.filterAjaxSuccess, 346 | error:fns.filterAjaxError 347 | }); 348 | // Adicionando classe ao label 349 | input.parent().addClass("sr_selected"); 350 | }, 351 | removeFilter:function(input) 352 | { 353 | var url=(input.attr("rel")||""); 354 | prodOverlay.fadeTo(300,0.6); 355 | if(url!=="") 356 | urlFilters=urlFilters.replace("&"+url,""); 357 | 358 | currentSearchUrl=fn.getUrl(); 359 | shelfJqxhr=jQuery.ajax({ 360 | url:currentSearchUrl, 361 | success:fns.filterAjaxSuccess, 362 | error:fns.filterAjaxError 363 | }); 364 | // Removendo classe do label 365 | input.parent().removeClass("sr_selected"); 366 | }, 367 | filterAjaxSuccess:function(data) 368 | { 369 | var $data=jQuery(data); 370 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 371 | fns.updateContent($data); 372 | ajaxCallbackObj.requests++; 373 | options.ajaxCallback(ajaxCallbackObj); 374 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 375 | }, 376 | filterAjaxError:function() 377 | { 378 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 379 | alert(options.filterErrorMsg); 380 | log("Houve um erro ao tentar fazer a requisição da página com filtros."); 381 | }, 382 | updateContent:function($data) 383 | { 384 | animatingFilter=true; 385 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 386 | 387 | var shelf=$data.filter(options.shelfClass); 388 | var shelfPage=loadContentE.find(options.shelfClass); 389 | 390 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 391 | jQuery(this).remove(); 392 | 393 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 394 | // corrigir um bug encontrado ao clicar em vários filtros 395 | if(options.usePopup) 396 | body.find(".boxPopUp2").vtexPopUp2(); 397 | else 398 | options.emptySearchElem.remove(); 399 | 400 | if(shelf.length>0) 401 | { 402 | shelf.hide(); 403 | loadContentE.append(shelf); 404 | options.shelfCallback(); 405 | shelf.slideDown(600,function(){ 406 | animatingFilter=false; 407 | }); 408 | ajaxCallbackObj.isEmpty=false; 409 | } 410 | else 411 | { 412 | ajaxCallbackObj.isEmpty=true; 413 | 414 | if(options.usePopup) 415 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 416 | else 417 | { 418 | loadContentE.append(options.emptySearchElem); 419 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 420 | options.emptySearchElem.fadeTo(300,1); 421 | }); 422 | } 423 | 424 | options.emptySearchCallback(ajaxCallbackObj); 425 | } 426 | }); 427 | }, 428 | adjustText:function(input) 429 | { 430 | var label=input.parent(), 431 | text=label.text(); 432 | qtt=""; 433 | 434 | text=fns.removeCounter(text); 435 | 436 | label.text(text).prepend(input); 437 | }, 438 | removeCounter:function(text) 439 | { 440 | return text.replace(/\([0-9]+\)/ig,function(a){ 441 | qtt=a.replace(/\(|\)/,""); 442 | return ""; 443 | }); 444 | }, 445 | setFilterMenu:function() 446 | { 447 | if(filtersMenuE.length>0) 448 | { 449 | linksMenuE.hide(); 450 | filtersMenuE.show(); 451 | } 452 | } 453 | }; 454 | 455 | if(body.hasClass("departamento")) 456 | fns.mergeMenu(); 457 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 458 | fns.mergeMenuList(); 459 | 460 | fns.exec(); 461 | fn.infinitScroll(); 462 | fn.scrollToTop(); 463 | options.callback(); 464 | 465 | // Exibindo o menu 466 | filtersMenuE.css("visibility","visible"); 467 | }; -------------------------------------------------------------------------------- /vtex-smartResearch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @contributor Edson Domingos Júnior 6 | * @version 3.9 7 | * @date 2012-10-22 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | jQuery.fn.vtexSmartResearch=function(opts) 12 | { 13 | var $this=jQuery(this); 14 | 15 | var log=function(msg,type){ 16 | if(typeof console=="object") 17 | console.log("[Smart Research - "+(type||"Erro")+"] "+msg); 18 | }; 19 | 20 | var defaults= 21 | { 22 | pageLimit:null, // Número máximo de páginas que o script irá retornar. Exemplo "pageLimit=3" só será retornado resultados até a terceira página 23 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 24 | shelfClass:".prateleira", // Pratelira de produtos (filha do elemento definido de um "loadContent") 25 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 26 | linksMenu:".search-single-navigator", // Menu de links 27 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 28 | mergeMenu:true, // Define se o menu de links será mesclado com o de filtros será mesclado na página de departamento 29 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de links será inserido após este elemento 30 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) no qual será adicionado a mensagem de busca vazia 31 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 32 | returnTopText:'voltar aoTOPO', // Mensagem de "retornar ao topo" 33 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html com a mensagem para ser apresentada quando não existirem resultados para os filtros selecionados 34 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro exibida quando existe algum erro de servidor ao aplicar os filtros 35 | searchUrl:null, // Url da página de busca (opicional) 36 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 37 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 38 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 39 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 40 | filterScrollTop:function(shelfOffset) 41 | { 42 | return (shelfOffset.top-20); 43 | }, 44 | callback:function(){}, 45 | // Cálculo do tamanho do conteúdo/vitrine para que uma nova página seja chamada antes do usuário chegar ao "final" do site 46 | getShelfHeight:function(container) 47 | { 48 | return (container.scrollTop()+container.height()); 49 | }, 50 | // Callback após inserir a prateleira na página 51 | shelfCallback:function(){}, 52 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 53 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 54 | ajaxCallback:function(){}, 55 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 56 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 57 | emptySearchCallback:function(){}, 58 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 59 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 60 | authorizeScroll:function(){return true;}, 61 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 62 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 63 | authorizeUpdate:function(){return true;}, 64 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 65 | labelCallback:function(data){} 66 | }; 67 | 68 | var options=jQuery.extend(defaults, opts), 69 | _console="object"===typeof(console), 70 | $empty=jQuery(""), 71 | elemLoading=jQuery(options.elemLoading), 72 | currentPage=2, 73 | moreResults=true, 74 | _window=jQuery(window), 75 | _document=jQuery(document), 76 | _html=jQuery("html,body"), 77 | body=jQuery("body"), 78 | currentSearchUrl="", 79 | urlFilters="", 80 | searchUrl="", 81 | animatingFilter=false, 82 | loadContentE=jQuery(options.loadContent), 83 | filtersMenuE=jQuery(options.filtersMenu), 84 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 85 | labelCallbackData={}; 86 | 87 | var fn= 88 | { 89 | getUrl:function(scroll) 90 | { 91 | var s=scroll||false; 92 | if(s) 93 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 94 | else 95 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 96 | }, 97 | getSearchUrl:function() 98 | { 99 | var url, content, preg; 100 | jQuery("script:not([src])").each(function(){ 101 | content=jQuery(this)[0].innerHTML; 102 | preg=/\/buscapagina\?.+&PageNumber=/i; 103 | if(content.search(/\/buscapagina\?/i)>-1) 104 | { 105 | url=preg.exec(content); 106 | return false; 107 | } 108 | }); 109 | 110 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 111 | return url[0]; 112 | else 113 | { 114 | log("Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 115 | return ""; 116 | } 117 | }, 118 | scrollToTop:function() 119 | { 120 | var elem=body.find("#returnToTop"); 121 | 122 | if(elem.length<1) 123 | { 124 | elem=jQuery(''); 125 | body.append(elem); 126 | } 127 | 128 | var windowH=_window.height(); 129 | _window.bind("resize",function(){ 130 | windowH=_window.height(); 131 | }); 132 | _window.bind("scroll",function(){ 133 | if(_window.scrollTop()>(windowH)) 134 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 135 | else 136 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 137 | }); 138 | elem.bind("click",function(){ 139 | _html.animate({scrollTop:0},"slow"); 140 | return false; 141 | }); 142 | }, 143 | infinitScroll:function() 144 | { 145 | var elementPages,pages,currentStatus,tmp; 146 | 147 | elementPages=body.find(".pager:first").attr("id"); 148 | tmp=(elementPages||"").split("_").pop(); 149 | pages=(null!==options.pageLimit)?options.pageLimit:window["pagecount_"+tmp]; 150 | currentStatus=true; 151 | 152 | // Reportando erros 153 | // if("undefined"===typeof pages) log("Não foi possível localizar quantidade de páginas.\n Tente adicionar o .js ao final da página. \n[Método: infinitScroll]"); 154 | 155 | if("undefined"===typeof pages) 156 | pages=99999999; 157 | 158 | _window.bind('scroll',function(){ 159 | var _this=jQuery(this); 160 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 161 | { 162 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 163 | { 164 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 165 | currentItems.after(elemLoading); 166 | currentStatus=false; 167 | pageJqxhr=jQuery.ajax({ 168 | url: fn.getUrl(true), 169 | success:function(data) 170 | { 171 | if(data.trim().length<1) 172 | { 173 | moreResults=false; 174 | log("Não existem mais resultados a partir da página: "+(currentPage-1),"Aviso"); 175 | } 176 | else 177 | currentItems.after(data); 178 | currentStatus=true; 179 | elemLoading.remove(); 180 | ajaxCallbackObj.requests++; 181 | options.ajaxCallback(ajaxCallbackObj); 182 | } 183 | }); 184 | currentPage++; 185 | } 186 | } 187 | else 188 | return false; 189 | }); 190 | } 191 | }; 192 | 193 | if(null!==options.searchUrl) 194 | currentSearchUrl=searchUrl=options.searchUrl; 195 | else 196 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 197 | 198 | // Reporting Errors 199 | if($this.length<1) 200 | { 201 | log("Nenhuma opção de filtro encontrada","Aviso"); 202 | if(options.showLinks) jQuery(options.linksMenu).css("visibility","visible").show(); 203 | fn.infinitScroll(); 204 | fn.scrollToTop(); 205 | return $this; 206 | } 207 | 208 | // Reporting Errors 209 | if(loadContentE.length<1){log("Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 210 | if(filtersMenuE.length<1) log("O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 211 | 212 | var currentUrl=document.location.href, 213 | linksMenuE=jQuery(options.linksMenu), 214 | prodOverlay=jQuery('
'), 215 | departamentE=jQuery(options.menuDepartament), 216 | loadContentOffset=loadContentE.offset(), 217 | pageNumber=1, 218 | shelfJqxhr=null, 219 | pageJqxhr=null; 220 | 221 | options.emptySearchElem.append(options.emptySearchMsg); 222 | loadContentE.before(prodOverlay); 223 | 224 | var fns= 225 | { 226 | exec:function() 227 | { 228 | fns.setFilterMenu(); 229 | fns.fieldsetFormat(); 230 | $this.each(function(){ 231 | var _this=jQuery(this), 232 | label=_this.parent(); 233 | 234 | if(_this.is(":checked")) 235 | { 236 | urlFilters+="&"+(_this.attr("rel")||""); 237 | // Adicionando classe ao label 238 | label.addClass("sr_selected"); 239 | } 240 | 241 | fns.adjustText(_this); 242 | // Add span vazio (depois de executar de "adjustText") 243 | label.append(''); 244 | 245 | _this.bind("change",function(){ 246 | fns.inputAction(); 247 | if(_this.is(":checked")) 248 | fns.addFilter(_this); 249 | else 250 | fns.removeFilter(_this); 251 | ajaxCallbackObj.filters=$this.filter(":checked").length; 252 | }); 253 | }); 254 | 255 | if(""!==urlFilters) 256 | fns.addFilter($empty); 257 | }, 258 | mergeMenu:function() 259 | { 260 | if(!options.mergeMenu) return false; 261 | 262 | var elem=departamentE; 263 | elem.insertAfter(options.insertMenuAfter); 264 | fns.departamentMenuFormat(elem); 265 | }, 266 | mergeMenuList:function() 267 | { 268 | var i=0; 269 | filtersMenuE.find("h3,h4").each(function(){ 270 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 271 | ul.insertAfter(jQuery(this)); 272 | fns.departamentMenuFormat(ul); 273 | i++; 274 | }); 275 | }, 276 | departamentMenuFormat:function(elem) 277 | { 278 | elem.find("a").each(function(){ 279 | var a=jQuery(this); 280 | a.text(fns.removeCounter(a.text())); 281 | }); 282 | }, 283 | fieldsetFormat:function() 284 | { 285 | labelCallbackData.fieldsetCount=0; 286 | labelCallbackData.tmpCurrentLabel={}; 287 | 288 | filtersMenuE.find("fieldset").each(function(){ 289 | var $t=jQuery(this), 290 | label=$t.find("label"), 291 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 292 | 293 | labelCallbackData[fieldsetClass]={}; 294 | 295 | // Ocultar fieldset quando não existe filtro e sair desste método 296 | if(label.length<1) 297 | { 298 | $t.hide(); 299 | return; 300 | } 301 | 302 | // Adicionar classe ao fieldset 303 | $t.addClass(fieldsetClass); 304 | 305 | // Adicionando classe e título ao label 306 | label.each(function(ndx){ 307 | var t=jQuery(this), 308 | v=(t.find("input").val()||""), 309 | labelClass="sr_"+v.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 310 | 311 | labelCallbackData.tmpCurrentLabel= 312 | { 313 | fieldsetParent:[$t,fieldsetClass], 314 | elem:t 315 | }; 316 | 317 | labelCallbackData[fieldsetClass][ndx.toString()]= 318 | { 319 | className:labelClass, 320 | title:v 321 | }; 322 | 323 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 324 | 325 | options.labelCallback(labelCallbackData); 326 | }); 327 | 328 | labelCallbackData.fieldsetCount++; 329 | }); 330 | }, 331 | inputAction:function() 332 | { 333 | if(null!==pageJqxhr) pageJqxhr.abort(); 334 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 335 | currentPage=2; 336 | moreResults=true; 337 | }, 338 | addFilter:function(input) 339 | { 340 | urlFilters+="&"+(input.attr("rel")||""); 341 | prodOverlay.fadeTo(300,0.6); 342 | currentSearchUrl=fn.getUrl(); 343 | shelfJqxhr=jQuery.ajax({ 344 | url:currentSearchUrl, 345 | success:fns.filterAjaxSuccess, 346 | error:fns.filterAjaxError 347 | }); 348 | // Adicionando classe ao label 349 | input.parent().addClass("sr_selected"); 350 | }, 351 | removeFilter:function(input) 352 | { 353 | var url=(input.attr("rel")||""); 354 | prodOverlay.fadeTo(300,0.6); 355 | if(url!=="") 356 | urlFilters=urlFilters.replace("&"+url,""); 357 | 358 | currentSearchUrl=fn.getUrl(); 359 | shelfJqxhr=jQuery.ajax({ 360 | url:currentSearchUrl, 361 | success:fns.filterAjaxSuccess, 362 | error:fns.filterAjaxError 363 | }); 364 | // Removendo classe do label 365 | input.parent().removeClass("sr_selected"); 366 | }, 367 | filterAjaxSuccess:function(data) 368 | { 369 | var $data=jQuery(data); 370 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 371 | fns.updateContent($data); 372 | ajaxCallbackObj.requests++; 373 | options.ajaxCallback(ajaxCallbackObj); 374 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 375 | }, 376 | filterAjaxError:function() 377 | { 378 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 379 | alert(options.filterErrorMsg); 380 | log("Houve um erro ao tentar fazer a requisição da página com filtros."); 381 | }, 382 | updateContent:function($data) 383 | { 384 | animatingFilter=true; 385 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 386 | 387 | var shelf=$data.filter(options.shelfClass); 388 | var shelfPage=loadContentE.find(options.shelfClass); 389 | 390 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 391 | jQuery(this).remove(); 392 | 393 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 394 | // corrigir um bug encontrado ao clicar em vários filtros 395 | if(options.usePopup) 396 | body.find(".boxPopUp2").vtexPopUp2(); 397 | else 398 | options.emptySearchElem.remove(); 399 | 400 | if(shelf.length>0) 401 | { 402 | shelf.hide(); 403 | loadContentE.append(shelf); 404 | options.shelfCallback(); 405 | shelf.slideDown(600,function(){ 406 | animatingFilter=false; 407 | }); 408 | ajaxCallbackObj.isEmpty=false; 409 | } 410 | else 411 | { 412 | ajaxCallbackObj.isEmpty=true; 413 | 414 | if(options.usePopup) 415 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 416 | else 417 | { 418 | loadContentE.append(options.emptySearchElem); 419 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 420 | options.emptySearchElem.fadeTo(300,1); 421 | }); 422 | } 423 | 424 | options.emptySearchCallback(ajaxCallbackObj); 425 | } 426 | }); 427 | }, 428 | adjustText:function(input) 429 | { 430 | var label=input.parent(), 431 | text=label.text(); 432 | qtt=""; 433 | 434 | text=fns.removeCounter(text); 435 | 436 | label.text(text).prepend(input); 437 | }, 438 | removeCounter:function(text) 439 | { 440 | return text.replace(/\([0-9]+\)/ig,function(a){ 441 | qtt=a.replace(/\(|\)/,""); 442 | return ""; 443 | }); 444 | }, 445 | setFilterMenu:function() 446 | { 447 | if(filtersMenuE.length>0) 448 | { 449 | linksMenuE.hide(); 450 | filtersMenuE.show(); 451 | } 452 | } 453 | }; 454 | 455 | if(body.hasClass("departamento")) 456 | fns.mergeMenu(); 457 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 458 | fns.mergeMenuList(); 459 | 460 | fns.exec(); 461 | fn.infinitScroll(); 462 | fn.scrollToTop(); 463 | options.callback(); 464 | 465 | // Exibindo o menu 466 | filtersMenuE.css("visibility","visible"); 467 | }; 468 | -------------------------------------------------------------------------------- /vtex-smartResearch.dev.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Pesquisa Inteligente 3 | * @description Execurar buscas sem recarregar a página 4 | * @author Carlos Vinicius 5 | * @contributor Edson Domingos Júnior 6 | * @version 3.9 7 | * @date 2012-10-22 8 | */ 9 | "function"!==typeof String.prototype.replaceSpecialChars&&(String.prototype.replaceSpecialChars=function(){var b={"\u00e7":"c","\u00e6":"ae","\u0153":"oe","\u00e1":"a","\u00e9":"e","\u00ed":"i","\u00f3":"o","\u00fa":"u","\u00e0":"a","\u00e8":"e","\u00ec":"i","\u00f2":"o","\u00f9":"u","\u00e4":"a","\u00eb":"e","\u00ef":"i","\u00f6":"o","\u00fc":"u","\u00ff":"y","\u00e2":"a","\u00ea":"e","\u00ee":"i","\u00f4":"o","\u00fb":"u","\u00e5":"a","\u00e3":"a","\u00f8":"o","\u00f5":"o",u:"u","\u00c1":"A","\u00c9":"E","\u00cd":"I","\u00d3":"O","\u00da":"U","\u00ca":"E","\u00d4":"O","\u00dc":"U","\u00c3":"A","\u00d5":"O","\u00c0":"A","\u00c7":"C"};return this.replace(/[\u00e0-\u00fa]/g,function(a){return"undefined"!=typeof b[a]?b[a]:a})}); 10 | "function"!==typeof String.prototype.trim&&(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")}); 11 | (function($){ 12 | jQuery.fn.vtexSmartResearch=function(opts) 13 | { 14 | $this=jQuery(this); 15 | 16 | var log=function(msg,type){ 17 | if(typeof console=="object") 18 | console.log("[Smart Research - "+(type||"Erro")+"] "+msg); 19 | }; 20 | 21 | var defaults= 22 | { 23 | pageLimit:null, // Número máximo de páginas (limite da paginação) 24 | loadContent:".prateleira[id^=ResultItems]", // Elemento que esta em volta da(s) prateleira(s) de produtos. 25 | shelfClass:".prateleira", // Pratelira de produtos (filha de "loadContent") 26 | filtersMenu:".search-multiple-navigator", // Menu com os filtros 27 | linksMenu:".search-single-navigator", // Menu de links 28 | menuDepartament:".navigation .menu-departamento", // seletor do menu da página de departamentos 29 | insertMenuAfter:".search-multiple-navigator h3:first", // O menu de departamento será inserido após este elemento 30 | emptySearchElem:jQuery('
'), // Elemento Html (em Objeto jQuery) da busca vazia 31 | elemLoading:'
Carregando ...
', // Elemento com mensagem de carregando ao iniciar a requisição da página seguinte 32 | returnTopText:'voltar aoTOPO', // Texto a ser inserido 33 | emptySearchMsg:'

Esta combinação de filtros não retornou nenhum resultado!

', // Html para quando a busca retornar vazia 34 | filterErrorMsg:"Houve um erro ao tentar filtrar a página!", // Mensagem de erro 35 | filterPage:"pagina-teste", // caminho para a página de filtros 36 | searchUrl:null, // Url da página de busca (opicional) 37 | removeCounter:false, // Define se será exibido o contador de resultados 38 | mergeMenu:true, // Definição se o menu será mesclado na página de departamento 39 | usePopup:false, // Opção p/ definir se deseja que a mensagem de não localizado seja exibida em um popup 40 | showLinks:true, // Exibe o menu de links caso o de filtro não seja encontrado 41 | popupAutoCloseSeconds:3, // Caso esteja utilizando popup, defina aqui o tempo para que ele feche automaticamente 42 | // Função que retorna o valor p/ onde a página deve rolar quando o usuário marca ou desmarca um filtro 43 | filterScrollTop:function(shelfOffset) 44 | { 45 | return (shelfOffset.top-20); 46 | }, 47 | callback:function(){}, 48 | // Cálculo do tamanho do conteúdo/vitrine para que uma nova página seja chamada antes do usuário chegar ao "final" do site 49 | getShelfHeight:function(container) 50 | { 51 | return (container.scrollTop()+container.height()); 52 | }, 53 | // Callback após inserir a prateleira na página 54 | shelfCallback:function(){}, 55 | // Callback em cada requisição Ajax (Para requisições feitas com sucesso) 56 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 57 | ajaxCallback:function(){}, 58 | // Função que é executada quando a seleção de filtros não retorna nenhum resultado 59 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 60 | emptySearchCallback:function(){}, 61 | // Função para permitir ou não que a rolagem infinita execute na página esta deve retornar "true" ou "false" 62 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 63 | authorizeScroll:function(){return true;}, 64 | // Função para permitir ou não que o conteúdo de "loadContent" seja atualizado. Esta deve retornar "true" ou "false" 65 | // Recebe como parâmetro um objeto contendo a quantidade total de requisições feitas e a quantidade de filtros selecionados 66 | authorizeUpdate:function(){return true;}, 67 | // Callback de cada laço percorrendo os fildsets e os labels. Retorna um objeto com algumas informações 68 | labelCallback:function(data){} 69 | }; 70 | 71 | var options=jQuery.extend(defaults, opts), 72 | _console="object"===typeof(console), 73 | $empty=jQuery(""), 74 | elemLoading=jQuery(options.elemLoading), 75 | currentPage=2, 76 | moreResults=true, 77 | _window=jQuery(window), 78 | _document=jQuery(document), 79 | _html=jQuery("html,body"), 80 | body=jQuery("body"), 81 | currentSearchUrl="", 82 | urlFilters="", 83 | searchUrl="", 84 | animatingFilter=false, 85 | loadContentE=jQuery(options.loadContent), 86 | filtersMenuE=jQuery(options.filtersMenu), 87 | ajaxCallbackObj={requests:0,filters:0,isEmpty:false}, 88 | labelCallbackData={}; 89 | 90 | var fn= 91 | { 92 | getUrl:function(option) 93 | { 94 | var s=option||false; // false => filtros | true => rolagem da página | 2 => pág. com os filtros 95 | if(s===true) 96 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber="+currentPage); 97 | else if(s==2) 98 | return currentSearchUrl.replace(/PageNumber=[0-9]*/,"PageNumber=1").replace("buscapagina",options.filterPage); 99 | else 100 | return (searchUrl+urlFilters).replace(/PageNumber=[0-9]*/,"PageNumber="+pageNumber); 101 | }, 102 | getSearchUrl:function() 103 | { 104 | var url, content, preg; 105 | jQuery("script:not([src])").each(function(){ 106 | content=jQuery(this)[0].innerHTML; 107 | preg=/\/buscapagina\?.+&PageNumber=/i; 108 | if(content.search(/\/buscapagina\?/i)>-1) 109 | { 110 | url=preg.exec(content); 111 | return false; 112 | } 113 | }); 114 | 115 | if(typeof(url)!=="undefined" && typeof(url[0])!=="undefined") 116 | return url[0]; 117 | else 118 | { 119 | log("Não foi possível localizar a url de busca da página.\n Tente adicionar o .js ao final da página. \n[Método: getSearchUrl]"); 120 | return ""; 121 | } 122 | }, 123 | scrollToTop:function() 124 | { 125 | var elem=body.find("#returnToTop"); 126 | 127 | if(elem.length<1) 128 | { 129 | elem=jQuery(''); 130 | body.append(elem); 131 | } 132 | 133 | var windowH=_window.height(); 134 | _window.bind("resize",function(){ 135 | windowH=_window.height(); 136 | }); 137 | _window.bind("scroll",function(){ 138 | if(_window.scrollTop()>(windowH)) 139 | elem.stop(true).fadeTo(300,1,function(){elem.show();}); 140 | else 141 | elem.stop(true).fadeTo(300,0,function(){elem.hide();}); 142 | }); 143 | elem.bind("click",function(){ 144 | _html.animate({scrollTop:0},"slow"); 145 | return false; 146 | }); 147 | }, 148 | infinitScroll:function() 149 | { 150 | var elementPages,pages,currentStatus,tmp; 151 | 152 | elementPages=body.find(".pager:first").attr("id"); 153 | tmp=(elementPages||"").split("_").pop(); 154 | pages=(null!==options.pageLimit)?options.pageLimit:window["pagecount_"+tmp]; 155 | currentStatus=true; 156 | 157 | if("undefined"===typeof pages) 158 | pages=99999999; 159 | 160 | _window.bind('scroll',function(){ 161 | var _this=jQuery(this); 162 | if(!animatingFilter && currentPage<=pages && moreResults && options.authorizeScroll(ajaxCallbackObj)) 163 | { 164 | if((_this.scrollTop()+_this.height())>=(options.getShelfHeight(loadContentE)) && currentStatus) 165 | { 166 | var currentItems=loadContentE.find(options.shelfClass).filter(":last"); 167 | currentItems.after(elemLoading); 168 | currentStatus=false; 169 | pageJqxhr=jQuery.ajax({ 170 | url: fn.getUrl(true), 171 | success:function(data) 172 | { 173 | if(data.trim().length<1) 174 | { 175 | moreResults=false; 176 | log("Não existem mais resultados a partir da página: "+(currentPage-1),"Aviso"); 177 | } 178 | else 179 | currentItems.after(data); 180 | currentStatus=true; 181 | elemLoading.remove(); 182 | ajaxCallbackObj.requests++; 183 | options.ajaxCallback(ajaxCallbackObj); 184 | } 185 | }); 186 | currentPage++; 187 | } 188 | } 189 | else 190 | return false; 191 | }); 192 | } 193 | }; 194 | 195 | if(null!==options.searchUrl) 196 | currentSearchUrl=searchUrl=options.searchUrl; 197 | else 198 | currentSearchUrl=searchUrl=fn.getSearchUrl(); 199 | 200 | // Reporting Errors 201 | if($this.length<1) 202 | { 203 | log("Nenhuma opção de filtro encontrada","Aviso"); 204 | if(options.showLinks) jQuery(options.linksMenu).css("visibility","visible").show(); 205 | fn.infinitScroll(); 206 | fn.scrollToTop(); 207 | return $this; 208 | } 209 | 210 | // Reporting Errors 211 | if(loadContentE.length<1){log("Elemento para destino da requisição não foi encontrado \n ("+loadContentE.selector+")"); return false;} 212 | if(filtersMenuE.length<1) log("O menu de filtros não foi encontrado \n ("+filtersMenuE.selector+")"); 213 | 214 | var currentUrl=document.location.href, 215 | linksMenuE=jQuery(options.linksMenu), 216 | prodOverlay=jQuery('
'), 217 | departamentE=jQuery(options.menuDepartament), 218 | loadContentOffset=loadContentE.offset(), 219 | pageNumber=1, 220 | shelfJqxhr=null, 221 | pageJqxhr=null; 222 | 223 | options.emptySearchElem.append(options.emptySearchMsg); 224 | loadContentE.before(prodOverlay); 225 | 226 | var fns= 227 | { 228 | exec:function() 229 | { 230 | fns.setFilterMenu(); 231 | fns.fieldsetFormat(); 232 | $this.each(function(){ 233 | var _this=jQuery(this), 234 | label=_this.parent(); 235 | 236 | if(_this.is(":checked")) 237 | { 238 | urlFilters+="&"+(_this.attr("rel")||""); 239 | // Adicionando classe ao label 240 | label.addClass("sr_selected"); 241 | } 242 | 243 | fns.adjustText(_this); 244 | // Add span vazio (depois de executar de "adjustText") 245 | label.append(''); 246 | 247 | _this.bind("change",function(){ 248 | fns.inputAction(); 249 | if(_this.is(":checked")) 250 | fns.addFilter(_this); 251 | else 252 | fns.removeFilter(_this); 253 | ajaxCallbackObj.filters=$this.filter(":checked").length; 254 | }); 255 | }); 256 | 257 | if(""!==urlFilters) 258 | fns.addFilter($empty); 259 | }, 260 | mergeMenu:function() 261 | { 262 | if(!options.mergeMenu) return false; 263 | 264 | var elem=departamentE; 265 | elem.insertAfter(options.insertMenuAfter); 266 | fns.departamentMenuFormat(elem); 267 | }, 268 | mergeMenuList:function() 269 | { 270 | var i=0; 271 | filtersMenuE.find("h3,h4").each(function(){ 272 | var ul=linksMenuE.find("h3,h4").eq(i).next("ul"); 273 | ul.insertAfter(jQuery(this)); 274 | fns.departamentMenuFormat(ul); 275 | i++; 276 | }); 277 | }, 278 | departamentMenuFormat:function(elem) 279 | { 280 | elem.find("a").each(function(){ 281 | var a=jQuery(this); 282 | a.text(fns.removeCounter(a.text())); 283 | }); 284 | }, 285 | fieldsetFormat:function() 286 | { 287 | labelCallbackData.fieldsetCount=0; 288 | labelCallbackData.tmpCurrentLabel={}; 289 | 290 | filtersMenuE.find("fieldset").each(function(){ 291 | var $t=jQuery(this), 292 | label=$t.find("label"), 293 | fieldsetClass="filtro_"+($t.find("h5:first").text()||"").toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 294 | 295 | labelCallbackData[fieldsetClass]={}; 296 | 297 | // Ocultar fieldset quando não existe filtro e sair desste método 298 | if(label.length<1) 299 | { 300 | $t.hide(); 301 | return; 302 | } 303 | 304 | // Adicionar classe ao fieldset 305 | $t.addClass(fieldsetClass); 306 | 307 | // Adicionando classe e título ao label 308 | label.each(function(ndx){ 309 | var t=jQuery(this), 310 | v=(t.find("input").val()||""), 311 | labelClass=fns.getLabelClass(t); 312 | 313 | labelCallbackData.tmpCurrentLabel= 314 | { 315 | fieldsetParent:[$t,fieldsetClass], 316 | elem:t 317 | }; 318 | 319 | labelCallbackData[fieldsetClass][ndx.toString()]= 320 | { 321 | className:labelClass, 322 | title:v 323 | }; 324 | 325 | t.addClass(labelClass).attr({"title":v,"index":ndx}); 326 | 327 | options.labelCallback(labelCallbackData); 328 | }); 329 | 330 | labelCallbackData.fieldsetCount++; 331 | }); 332 | }, 333 | getLabelClass:function($this) 334 | { 335 | var v; 336 | v=($this.find("input").val()||"empty_"); 337 | return "sr_"+fns.toClass(v); 338 | }, 339 | toClass:function(str) 340 | { 341 | return str.toLowerCase().replaceSpecialChars().replace(/\s/g,"-"); 342 | }, 343 | inputAction:function() 344 | { 345 | if(null!==pageJqxhr) pageJqxhr.abort(); 346 | if(null!==shelfJqxhr) shelfJqxhr.abort(); 347 | currentPage=2; 348 | moreResults=true; 349 | }, 350 | addFilter:function(input) 351 | { 352 | urlFilters+="&"+(input.attr("rel")||""); 353 | prodOverlay.fadeTo(300,0.6); 354 | currentSearchUrl=fn.getUrl(); 355 | shelfJqxhr=jQuery.ajax({ 356 | url:currentSearchUrl, 357 | success:fns.filterAjaxSuccess, 358 | error:fns.filterAjaxError 359 | }); 360 | // Adicionando classe ao label 361 | input.parent().addClass("sr_selected"); 362 | 363 | fns.rearrangeFilters(input); 364 | }, 365 | removeFilter:function(input) 366 | { 367 | var url=(input.attr("rel")||""); 368 | prodOverlay.fadeTo(300,0.6); 369 | if(url!=="") 370 | urlFilters=urlFilters.replace("&"+url,""); 371 | 372 | currentSearchUrl=fn.getUrl(); 373 | shelfJqxhr=jQuery.ajax({ 374 | url:currentSearchUrl, 375 | success:fns.filterAjaxSuccess, 376 | error:fns.filterAjaxError 377 | }); 378 | // Removendo classe do label 379 | input.parent().removeClass("sr_selected"); 380 | 381 | fns.rearrangeFilters(input); 382 | }, 383 | filterAjaxSuccess:function(data) 384 | { 385 | var $data=jQuery(data); 386 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 387 | fns.updateContent($data); 388 | ajaxCallbackObj.requests++; 389 | options.ajaxCallback(ajaxCallbackObj); 390 | _html.animate({scrollTop:options.filterScrollTop((loadContentOffset||{top:0,left:0}))},600); 391 | }, 392 | filterAjaxError:function() 393 | { 394 | prodOverlay.fadeTo(300,0,function(){jQuery(this).hide();}); 395 | alert(options.filterErrorMsg); 396 | log("Houve um erro ao tentar fazer a requisição da página com filtros."); 397 | }, 398 | rearrangeFilters:function(input) 399 | { 400 | var label,fieldset; 401 | 402 | label=input.parent(); 403 | fieldset=label.parent().parent(); 404 | 405 | $.ajax({ 406 | url:fn.getUrl(2), 407 | success:function(data){ 408 | var $d=$(data); 409 | filtersMenuE.find("fieldset").each(function(){ 410 | var h5,fieldset,remoteFieldset; 411 | fieldset=$(this); 412 | h5=$d.find(".search-multiple-navigator h5:contains('"+fieldset.find("h5").text()+"')"); 413 | if(h5.length>1) 414 | { 415 | h5.each(function(){ 416 | var _fieldset=$(this).parent(); 417 | if(_fieldset.index()===fieldset.index()) 418 | remoteFieldset=_fieldset; 419 | }); 420 | } 421 | else 422 | remoteFieldset=h5.parent(); 423 | 424 | remoteFieldset.find("label").each(function(){ 425 | var labelClass,fieldset; 426 | fieldset=$(this); 427 | labelClass=fns.getLabelClass(fieldset); 428 | fieldset.addClass(labelClass); 429 | }); 430 | 431 | if(remoteFieldset.find("input").length) 432 | fieldset.find("label").each(function(){ 433 | var _class,label,remoteLabel,input; 434 | label=$(this); 435 | _class="sr_"+label.attr("class").split("sr_").pop().split(" ").shift(); 436 | 437 | remoteLabel=remoteFieldset.find("label."+_class); 438 | console.log(remoteLabel); 439 | if(remoteLabel.length) 440 | label.removeClass("sr_disabled").find(".sr_text").text(remoteLabel.text()); 441 | else 442 | label.addClass("sr_disabled"); 443 | }); 444 | }); 445 | }, 446 | error:function(){log("Não foi possível obter a página com os dados do admin.");} 447 | }); 448 | }, 449 | updateContent:function($data) 450 | { 451 | animatingFilter=true; 452 | if(!options.authorizeUpdate(ajaxCallbackObj)) return false; 453 | 454 | var shelf=$data.filter(options.shelfClass); 455 | var shelfPage=loadContentE.find(options.shelfClass); 456 | 457 | (shelfPage.length>0?shelfPage:options.emptySearchElem).slideUp(600,function(){ 458 | jQuery(this).remove(); 459 | 460 | // Removendo a mensagem de busca vazia, esta remoção "forçada" foi feita para 461 | // corrigir um bug encontrado ao clicar em vários filtros 462 | if(options.usePopup) 463 | body.find(".boxPopUp2").vtexPopUp2(); 464 | else 465 | options.emptySearchElem.remove(); 466 | 467 | if(shelf.length>0) 468 | { 469 | shelf.hide(); 470 | loadContentE.append(shelf); 471 | options.shelfCallback(); 472 | shelf.slideDown(600,function(){ 473 | animatingFilter=false; 474 | }); 475 | ajaxCallbackObj.isEmpty=false; 476 | } 477 | else 478 | { 479 | ajaxCallbackObj.isEmpty=true; 480 | 481 | if(options.usePopup) 482 | options.emptySearchElem.addClass("freeContent autoClose ac_"+options.popupAutoCloseSeconds).vtexPopUp2().stop(true).show(); 483 | else 484 | { 485 | loadContentE.append(options.emptySearchElem); 486 | options.emptySearchElem.show().css("height","auto").fadeTo(300,0.2,function(){ 487 | options.emptySearchElem.fadeTo(300,1); 488 | }); 489 | } 490 | 491 | options.emptySearchCallback(ajaxCallbackObj); 492 | } 493 | }); 494 | }, 495 | adjustText:function(input) 496 | { 497 | var label,text,qtt=""; 498 | label=input.parent(); 499 | text=label.text(); 500 | 501 | text=''+fns.removeCounter(text)+''; 502 | 503 | label.html(text).prepend(input); 504 | }, 505 | removeCounter:function(text) 506 | { 507 | if(options.removeCounter) 508 | return text.replace(/\([0-9]+\)/ig,function(a){ 509 | // qtt=a.replace(/\(|\)/,""); 510 | return ""; 511 | }); 512 | else 513 | return text; 514 | }, 515 | setFilterMenu:function() 516 | { 517 | if(filtersMenuE.length>0) 518 | { 519 | linksMenuE.hide(); 520 | filtersMenuE.show(); 521 | } 522 | } 523 | }; 524 | 525 | if(body.hasClass("departamento")) 526 | fns.mergeMenu(); 527 | else if(body.hasClass("categoria") || body.hasClass("resultado-busca")) 528 | fns.mergeMenuList(); 529 | 530 | fns.exec(); 531 | fn.infinitScroll(); 532 | fn.scrollToTop(); 533 | options.callback(); 534 | 535 | // Exibindo o menu 536 | filtersMenuE.css("visibility","visible"); 537 | }; 538 | })(jQuery); 539 | 540 | $(function(){ 541 | $(".columnLeft .search-multiple-navigator input[type='checkbox']").vtexSmartResearch({ 542 | filterScrollTop:function(shelfOffset){return (shelfOffset.top-95);} 543 | }); 544 | 545 | $(".navigation").hide(); 546 | }); --------------------------------------------------------------------------------