;(function() { window.createMeasureObserver = (measureName) => { var markPrefix = `_uol-measure-${measureName}-${new Date().getTime()}`; performance.mark(`${markPrefix}-start`); return { end: function() { performance.mark(`${markPrefix}-end`); performance.measure(`uol-measure-${measureName}`, `${markPrefix}-start`, `${markPrefix}-end`); performance.clearMarks(`${markPrefix}-start`); performance.clearMarks(`${markPrefix}-end`); } } }; /** * Gerenciador de eventos */ window.gevent = { stack: [], RUN_ONCE: true, on: function(name, callback, once) { this.stack.push([name, callback, !!once]); }, emit: function(name, args) { for (var i = this.stack.length, item; i--;) { item = this.stack[i]; if (item[0] === name) { item[1](args); if (item[2]) { this.stack.splice(i, 1); } } } } }; var runningSearch = false; var hadAnEvent = true; var elementsToWatch = window.elementsToWatch = new Map(); var innerHeight = window.innerHeight; // timestamp da última rodada do requestAnimationFrame // É usado para limitar a procura por elementos visíveis. var lastAnimationTS = 0; // verifica se elemento está no viewport do usuário var isElementInViewport = function(el) { var rect = el.getBoundingClientRect(); var clientHeight = window.innerHeight || document.documentElement.clientHeight; // renderizando antes, evitando troca de conteúdo visível no chartbeat-related-content if(el.className.includes('related-content-front')) return true; // garante que usa ao mínimo 280px de margem para fazer o lazyload var margin = clientHeight + Math.max(280, clientHeight * 0.2); // se a base do componente está acima da altura da tela do usuário, está oculto if(rect.bottom < 0 && rect.bottom > margin * -1) { return false; } // se o topo do elemento está abaixo da altura da tela do usuário, está oculto if(rect.top > margin) { return false; } // se a posição do topo é negativa, verifica se a altura dele ainda // compensa o que já foi scrollado if(rect.top < 0 && rect.height + rect.top < 0) { return false; } return true; }; var asynxNextFreeTime = () => { return new Promise((resolve) => { if(window.requestIdleCallback) { window.requestIdleCallback(resolve, { timeout: 5000, }); } else { window.requestAnimationFrame(resolve); } }); }; var asyncValidateIfElIsInViewPort = function(promise, el) { return promise.then(() => { if(el) { if(isElementInViewport(el) == true) { const cb = elementsToWatch.get(el); // remove da lista para não ser disparado novamente elementsToWatch.delete(el); cb(); } } }).then(asynxNextFreeTime); }; // inicia o fluxo de procura de elementos procurados var look = function() { if(window.requestIdleCallback) { window.requestIdleCallback(findByVisibleElements, { timeout: 5000, }); } else { window.requestAnimationFrame(findByVisibleElements); } }; var findByVisibleElements = function(ts) { var elapsedSinceLast = ts - lastAnimationTS; // se não teve nenhum evento que possa alterar a página if(hadAnEvent == false) { return look(); } if(elementsToWatch.size == 0) { return look(); } if(runningSearch == true) { return look(); } // procura por elementos visíveis apenas 5x/seg if(elapsedSinceLast < 1000/5) { return look(); } // atualiza o último ts lastAnimationTS = ts; // reseta status de scroll para não entrar novamente aqui hadAnEvent = false; // indica que está rodando a procura por elementos no viewport runningSearch = true; const done = Array.from(elementsToWatch.keys()).reduce(asyncValidateIfElIsInViewPort, Promise.resolve()); // obtém todos os elementos que podem ter view contabilizados //elementsToWatch.forEach(function(cb, el) { // if(isElementInViewport(el) == true) { // // remove da lista para não ser disparado novamente // elementsToWatch.delete(el); // cb(el); // } //}); done.then(function() { runningSearch = false; }); // reinicia o fluxo de procura look(); }; /** * Quando o elemento `el` entrar no viewport (-20%), cb será disparado. */ window.lazyload = function(el, cb) { if(el.nodeType != Node.ELEMENT_NODE) { throw new Error("element parameter should be a Element Node"); } if(typeof cb !== 'function') { throw new Error("callback parameter should be a Function"); } elementsToWatch.set(el, cb); } var setEvent = function() { hadAnEvent = true; }; window.addEventListener('scroll', setEvent, { capture: true, ive: true }); window.addEventListener('click', setEvent, { ive: true }); window.addEventListener('resize', setEvent, { ive: true }); window.addEventListener('load', setEvent, { once: true, ive: true }); window.addEventListener('DOMContentLoaded', setEvent, { once: true, ive: true }); window.gevent.on('allJSLoadedAndCreated', setEvent, window.gevent.RUN_ONCE); // inicia a validação look(); })();
  • AssineUOL
Topo

Danilo Lavieri

Como Palmeiras chegou ao nome de Abel Ferreira para substituir Luxemburgo

Técnico Abel Ferreira comanda o Palmeiras contra o Red Bull Bragantino, em jogo da Copa do Brasil 2020 - Marcello Zambrana/AGIF
Técnico Abel Ferreira comanda o Palmeiras contra o Red Bull Bragantino, em jogo da Copa do Brasil 2020 Imagem: Marcello Zambrana/AGIF

Colunista do UOL

04/12/2020 04h00

Receba os novos posts desta coluna no seu e-mail

Email inválido

Em alta no Palmeiras após um mês de trabalho, Abel Ferreira foi o escolhido pela diretoria após indicação do departamento de análise de desempenho. Depois do insucesso com Miguel Ángel Ramirez, que também já havia ado por esse crivo inicial, o time se fechou nas alternativas indicadas pelos especialistas com base em alguns conceitos que a diretoria não queria abrir mão.

Depois de demitir Mano Menezes, o discurso de acompanhar a modernidade do futebol não foi cumprido com a contratação de Vanderlei Luxemburgo. Com a tentativa frustrada, a ordem era não abrir mão desta vez de alguns requisitos mínimos e, com esse filtro, os candidatos foram indicados.

Um bom histórico de trabalho com atletas de base, estilos modernos de treinamento e propostas de modelo de jogo eram alguns dos conceitos considerados obrigatórios para a contratação. O sigilo do processo é apontado como fundamental para a evolução da negociação.

Após essa análise, o nome de Abel ganhou força. O vice-presidente Alexandre Zanotta marcou uma reunião por vídeo com o português para o primeiro contato. O encontro foi considerado positivo, e o dirigente indicou a Maurício Galiotte e Anderson Barros que ele indicou que gostaria de assumir o projeto Alviverde.

O segundo o foi marcar mais um encontro virtual, desta vez com a presença de Zanotta, Paulo Buosi, Anderson e Cícero Souza. Neste papo, o tema foi metodologia de trabalho, objetivos nos campeonatos disputados e especificidades do dia a dia na Academia de Futebol. A avaliação também foi positiva, permitindo que a conversa fosse para os aspectos financeiros.

Com o sim, o Palmeiras ou a negociar com o PAOK, da Grécia, o pagamento da multa rescisória, que teve redução de quase 90%. O total ficou em torno de R$ 4 milhões e foi pago à vista. O português entendia que seu período na equipe grega havia expirado e que era hora de um novo trabalho.

Com um mês de trabalho, Abel vive período de lua de mel com o Alviverde, com sete vitórias, um empate e uma derrota, com 20 gols marcados. Atletas até então desacreditados voltaram a render, como Zé Rafael, Raphael Veiga e Lucas Lima, e a equipe está classificada para a semifinal da Copa do Brasil e para as quartas de final da Libertadores.

Recentemente, uma proposta do Qatar chegou para o português, que recusou inicialmente. A diretoria sabe que o treinador será alvo de mais sondagens com o bom desempenho no Brasil.