/**
* Classe para navegacao dos posts.
* O posts são cadastrados no blog de Rexona e separados por universo, tags e origem.
* 
* @constructor
* @param  universe          universo escolhido pelo usuario
* @param  defaultException  excecao padrao do weekly review 
*/
var Blog = function(universe, defaultException) {
	universe = universe.toUpperCase();
	if (!['M', 'W'].include(universe))
		return;
	
	this.reviewsBody = $$('.left > div.reviews').first();							// elemento onde os posts serão listados
	this.reviewsBody.columnLeft = new Element('div').addClassName('coluna a');		// coluna da esquerda para listagem dos posts, tambem utilizado para busca de posts
	this.reviewsBody.columnRight = new Element('div').addClassName('coluna b');		// coluna da direita para listagem dos posts, tambem utilizado para mostrar destaques das tags
	this.reviewsBody.insert({top: this.reviewsBody.columnLeft, bottom: this.reviewsBody.columnRight});

	this.resultSearch = $$('.resultado-busca').first();		// cabecalho do resultado da busca 
	this.pagination = $$('.paginacao').first();				// rodape da listagem dos posts que tem paginacao
	
	// template da listagem de cada post
	this.postTemplate = new Template('<div class="review #{tag}" title="#{title-tag}"><h3><a href="#{urlPost}" rel="#{target}" title="#{titulo}">#{titulo}<\/a><\/h3><p><a href="#{urlPost}" rel="#{target}">#{texto}<\/a><\/p><small>por #{autor} | #{data} | <a href="javascript:;" title="enviar por e-mail" onclick="#{post-email}">enviar por e-mail<\/a><\/small><\/div>');

	this.lastHeight = 0;						// armazena a soma da altura dos posts para redimensionamento do reviewsBody em uma nova listagem

	this.isLoading = false;						// armazena se a pagina esta sendo carregada
	this.isSearch = false;						// armazena se a listagem de posts eh uma busca
	this.reloadList = false;					// armazena se e necessario uma nova listagem de posts apos usuario solicatar varias listagem em um curto 													   espaco de tempo
	
	this.hasPostFlashs = false;					// armazena se será necessario mostrar os destaques em flash na coluna da direita

	this.defaultOrigin = 2;						// origem padrao 0 - posts internos, 1 - posts externos, 2 - todos os posts
	this.defaultPage = 1;						// pagina padrao (1 = default)
	this.defaultPerPage = 12;					// numero de posts por pagina (12 = default)
	this.defaultTag = 0;						// tag padrao (0 = todas as tags)
	this.defaultException = defaultException;	// excecao padrao do weekly review
	this.defaultSubtract = 2;					// numero padrao de posts que deve ser escondido na listagem dos posts (2 = default)
	this.defaultMoreClicked = 0;				// posts mais clicados (0 = default)
	
	// objeto com as configuracoes do blog
	this.options = {
		universe: universe,
		origin: this.defaultOrigin,
		page: this.defaultPage,
		perPage: this.defaultPerPage,
		tag: this.defaultTag,
		categoria: '',
		text: '',
		exception: this.defaultException,
		subtract: this.defaultSubtract,
		moreClicked: this.defaultMoreClicked,
		numberPages: 1
	};
};

// tags para o tracker (men e women)
Blog.tags = {
	'M' : ['todos','fanáticos por futebol','tech toys','adrenalina'],
	'W' : ['todos','moda e estilo','dia-a-dia','amor e relacionamento','meu momento']
};

/**
* Pega a indentificacao do universo
* @return O universo definido quando a classe foi intanciada
*/
Blog.prototype.getUniverse = function() {
	return this.options.universe;
};

/**
* Define a origem (1, 2 ou 0)
* @param origin define a nova origem
* @return this se a origem foi modificada ou null se aconteceu algum erro
*/
Blog.prototype.setOrigin = function(origin) {
	if (!$R(0, 2).include(origin))
		return;

	this.options.origin = origin;
	return this;
};

/**
* Pega a origem
* @return A origem padrao ou definida pelo usuario
*/
Blog.prototype.getOrigin = function() {
	return this.options.origin;
};

/**
* Reseta a origem
* Define para o padrao
* @return this
*/
Blog.prototype.resetOrigin = function() {
	this.setOrigin(this.defaultOrigin);
	return this;
};

/**
* Reseta os parametros de listagem, modifica a origem e refaz a listagem (com tracker)
* @param origin define a nova origem
* @return this
*/
Blog.prototype.changeOrigin = function(origin) {
	this.clearSearch()
		.clearException()
		.resetPage()
		.resetPerPage()
		.resetTag()
		.resetMoreClicked()
		.setOrigin(origin)
		.setSubtract(0)
		.list();
	
	// tracer quando clicar para filtrar todos os weekly reviews  - modo de exibição na home
	GA.track('/site/' + (this.getUniverse() == 'M' ? 'man' : 'women') + '/weekly reviews');

	Blog.clearTag();
	return this;
};

/**
* Define a pagina
* @param page efine o numero da nova pagina
* @return this
*/
Blog.prototype.setPage = function(page) {
	this.options.page = !page || page < 0 ? 0 :
		(page > this.getNumberPages() ? this.getNumberPages() : page);

	return this;
};

/**
* Page o numero da pagina
* @return a pagina
*/
Blog.prototype.getPage = function() {
	return this.options.page;
};

/**
* Reseta a pagina
* Define para o padrao
* @return this
*/
Blog.prototype.resetPage = function() {
	this.setPage(this.defaultPage);
	return this;
};

/**
* Verifica se a pagina eh valida, define a pagina e faz a listagem dos posts (com tracker)
* @param page define o numero da nova pagina
* @return this
*/
Blog.prototype.changePage = function(page) {
	if (page < 1 || page > this.getNumberPages())
		return;

	// tracker quando paginar, independetemente do filtro ou do numero da pagina
	GA.track('/site/' + (this.getUniverse() == 'M' ? 'man' : 'women') + '/paginacao');

	this.setPage(page)
		.list();

	return this;
};

/**
* Avanca pagina
* @return this
*/
Blog.prototype.nextPage = function() {
	this.changePage(this.getPage() + 1);
	return this;
};

/**
* Volta pagina
* @return this
*/
Blog.prototype.previousPage = function() {
	this.changePage(this.getPage() - 1);
	return this;
};

/**
* Define o numero de posts por pagina
* @param perPage define o numero de posts por pagina
* @return this
*/
Blog.prototype.setPerPage = function(perPage) {
	this.options.perPage = perPage;
	return this;
};

/**
* Pega o numero de posts por pagina
* @return numero de posts por pagina
*/
Blog.prototype.getPerPage = function() {
	return this.options.perPage;
};

/**
* Reseta numero de posts pots pagina
* Define para o padrao
* @return this
*/
Blog.prototype.resetPerPage = function() {
	this.setPerPage(this.defaultPerPage);
	return this;
};

/**
* Define o numero de paginas e cria a paginacao se necessario
* @param number define o numero de paginas
* @return this
*/
Blog.prototype.setNumberPages = function(number) {
	this.options.numberPages = (!number || number < 1) ? 1 : number;
	if (this.getNumberPages() > 1)
		this.createPagination();

	return this;
};

/**
* Pega o numero paginas
* @return numero de paginas
*/
Blog.prototype.getNumberPages = function() {
	return this.options.numberPages;
};

/**
* Cria a paginacao
* @return this
*/
Blog.prototype.createPagination = function() {
	var element;

	this.pagination.update('');
	
	element = new Element('a', {href: 'javascript:;', title: 'Anterior'})
		.addClassName('anterior')
		.update('Anterior')
		.observe('click', function(number) {
			this.previousPage();
		}.bind(this, i));

	this.pagination.insert(element);
	
	var pagination = {};
	pagination.totalPages = this.getNumberPages();
	pagination.totalListedPages = 20;
	pagination.pagePerSide = Math.ceil(pagination.totalListedPages / 2);

	pagination.leftSide = 1;
	pagination.rightSide = pagination.totalListedPages;

	if (this.getPage() >= pagination.totalPages - pagination.pagePerSide) {
		pagination.leftSide += pagination.totalPages - pagination.totalListedPages;
		pagination.rightSide = pagination.totalPages ;
	} else if (this.getPage() > pagination.pagePerSide) {
		pagination.leftSide += this.getPage() - pagination.pagePerSide;
		pagination.rightSide += this.getPage() - pagination.pagePerSide;
	}

	var init = pagination.leftSide < 1 ? 1 : pagination.leftSide;
	var end = pagination.rightSide > pagination.totalPages ? pagination.totalPages : pagination.rightSide;

	for (var i = init; i <= end; i++) {
	//for (var i = 1, numberPages = this.getNumberPages() > 20 ? 20 : this.getNumberPages(); i <= numberPages; i++) {
		element = new Element('a', {href: 'javascript:;', title: 'Página ' + i})
			.update(i)
			.observe('click', function(number) {
				this.changePage(number);
			}.bind(this, i));

		if (i == this.getPage())
			element.addClassName('ativo');

		this.pagination.insert(element);
	}
	
	element = new Element('a', {href: 'javascript:;', title: 'Próximo'})
		.addClassName('proximo')
		.update('Próximo')
		.observe('click', function(number) {
			this.nextPage();
		}.bind(this, i));
	this.pagination.insert(element);
	var w =  (((end - init + 1) * 23) + 190);

	this.pagination.setStyle({width: w + 'px', left: '50%', marginLeft: - ((w / 2) + 5 + (Prototype.Browser.IE ? 10 : 0 ))+ 'px'});

	return this;
};

/**
* Remove a paginacao
* @return this
*/
Blog.prototype.removePagination = function() {
	this.pagination.update('');
	return this;
};

/**
* Define a tag
* @param tag id da tag
* @return this
*/
Blog.prototype.setTag = function(tag) {
	this.options.tag = (!tag || tag < 0) ? 0 : tag;
	return this;
};

/**
* Pega a tag selecionada
* @return this
*/
Blog.prototype.getTag = function() {
	return this.options.tag;
};

/**
* Reseta a tag
* Define para o padrao
* @return this
*/
Blog.prototype.resetTag = function() {
	this.setTag(this.defaultTag);
	return this;
};

/**
* Reseta os paramentos da listagem, define a tag, altera a class do elemento e retorna os posts na tela!
* @param tag id da tag
* @param element elemento para a troca de class (tags)
* @return this
*/
Blog.prototype.changeTag = function(tag, element) {
	this.clearSearch();
	this.resetOrigin();
	this.resetPage();
	this.resetPerPage();
	this.resetException();
	this.resetSubtract();
	this.resetMoreClicked();
	this.setTag(tag);
	this.updateDestaque();
	this.list();
		
	
	//
	$('weekly-review-destaque').show();
	$('destaque').show();
	
	// tracker quando clicar para filtrar - modo de exibição na home
	var tracker = '/site/' + (this.getUniverse() == 'M' ? 'man' : 'women') + '/' + Blog.tags[this.getUniverse()][tag];
	GA.track(tracker);

	if (element)
		this.activeTag(element);
		
	

	return this;
};

/**
*
*
*/
Blog.prototype.updateDestaque = function() {
	
	var post;
	
	new Ajax.Request(
		'http://www.rexona.com.br/site/blog_lista_posts.php', 
		{
			method: 'post',
			parameters: {
				universo: this.getUniverse(),
				origem: this.getOrigin(),
				pagina: 1,
				porpagina: 1,
				tag: this.getTag(),
				categoria: this.getCategoria(),
				busca: this.getSearch(),
				excecao: this.getException(),
				desconto: this.getSubtract(),
				maisclicados: this.getMoreClicked()
			},
			asynchronous: false,
			onSuccess: function(transport,json) {
				//alert(transport.responseText);
				post = $H(transport.responseText.evalJSON());			// objeto com o post
				post = post.get(0);
				
				// caso seja um post de uma fonte externa, constroi um link para o blog do autor
				if (post.urlBlog)
					post.autor = '<a href="'+post.urlBlog+'" rel="'+post.target+'" title="'+post.autor+'">'+post['autor']+'<\/a>';
				
				
				// atualiza campos de destaque
				$$('div.weekly-review h3 a').first()
					.writeAttribute('title', post.titulo)
					.writeAttribute('href', post.urlBlog)
					.update(post.titulo);
					
				$$('div.weekly-review small').first()
					.update('por ' + post.autor + ' em ' + post.data+' às ' + post.hora);
					
										
			}
		}
	);
	
	// seta excecao
	this.setException(post.idPost);

	return this;
};

/**
* Define a categoria
* @param categoria sexy,happy,''
* @return this
*/
Blog.prototype.setCategoria = function(categoria) {
	this.options.categoria = (!categoria) ? '' : categoria;
	return this;
};

/**
* Pega a tag selecionada
* @return this
*/
Blog.prototype.getCategoria = function() {
	return this.options.categoria;
};

/**
* Define o texto para a busca
* @param text texto para a busca
* @return this
*/
Blog.prototype.setSearch = function(text) {
	this.options.text = text;
	return this;
};

/**
* Pega o texto da busca
* @return texto da busca
*/
Blog.prototype.getSearch = function() {
	return this.options.text;
};

/**
* Limpa a busca e define a veriavel isSearch para false
* @return this
*/
Blog.prototype.clearSearch = function() {
	this.setSearch('');
	this.isSearch = false;
	return this;
};

/**
* Reseta os paramentos da listagem define o texto da busca, altera a class do elemento e retorna os posts na tela!
* @param text texto para a busca
* @param referer local de onde veio o posts para montar a acao do botao "voltar"
* @return this
*/
Blog.prototype.search = function(text, referer) {
	this.isSearch = true;
	this.referer = referer
	
	$('weekly-review-destaque').hide();
	$('destaque').hide();
	
	this.clearException()
		.resetOrigin()
		.resetPage()
		.resetTag()
		.resetMoreClicked()
		.setPerPage(7)
		.setSearch(text)
		.setSubtract(0)
		.list();

	Blog.clearTag();
	return this;
};

/**
* Define a(s) excecao(oes)
* @param exception excecoes separadas por ","
* @return this
*/
Blog.prototype.setException = function(exception) {
	this.options.exception = exception;
	return this;
};

/**
* Pega a(s) excecao(oes)
* @return uma string formatada com as excecoes separadas por ","
*/
Blog.prototype.getException = function() {
	return this.options.exception;
};

/**
* Limpa a(s) exception(s)
* @return this
*/
Blog.prototype.clearException = function() {
	this.setException('');
	return this;
};

/**
* Reseta a excecao
* Define para o padrao
* @return this
*/
Blog.prototype.resetException = function() {
	this.setException(this.defaultException);
	return this;
};

/**
* Define o numero de posts que deve ser diminiudo
* @param subtract numero de posts que deve ser diminiudo
* @return this
*/
Blog.prototype.setSubtract = function(subtract) {
	this.options.subtract = subtract;
	return this;
};

/**
* Pega o numero de posts que deve ser diminiudos
* @return o novo numero de diminuioes
*/
Blog.prototype.getSubtract = function() {
	return this.options.subtract;
};

/**
* Reseta o numero de posts que deve ser diminiudo
* Define para o padrao
* @return this
*/
Blog.prototype.resetSubtract = function() {
	this.setSubtract(this.defaultSubtract);
	return this;
};

/**
* Define listagem dos posts mais clicadaos
* @param  moreClicked 1 para listar os posts mais clicados
* @return this
*/
Blog.prototype.setMoreClicked = function(moreClicked) {
	this.options.moreClicked = moreClicked;
	return this;
};

/**
* Pega o os posts mais clicados
* @return o novo numero de diminuioes
*/
Blog.prototype.getMoreClicked = function() {
	return this.options.moreClicked;
};

/**
* Reseta os posts mais clidados
* Define para o padrao
* @return this
*/
Blog.prototype.resetMoreClicked = function() {
	this.setMoreClicked(this.defaultMoreClicked);
	return this;
};

/**
* Reseta os paramentos da listagem, define que sera mostrado os posts mais clicados, e retorna os posts na tela!
* @param moreClicked 1 para listar os posts mais clicados
* @return this
*/
Blog.prototype.changeMoreClicked = function(moreClicked) {
	this.clearSearch()
		.clearException()
		.resetOrigin()
		.resetPage()
		.resetPerPage()
		.resetTag()
		.setMoreClicked(moreClicked)
		.setSubtract(0)
		.list();

	Blog.clearTag();
	return this;
};

/**
* Formata e a configuracao do blog para post
* @return object
*/
Blog.prototype.getParameters = function() {
	return {
		universo: this.getUniverse(),
		origem: this.getOrigin(),
		pagina: this.getPage(),
		porpagina: this.getPerPage(),
		tag: this.getTag(),
		categoria: this.getCategoria(),
		busca: this.getSearch(),
		excecao: this.getException(),
		desconto: this.getSubtract(),
		maisclicados: this.getMoreClicked()
	};
};

/**
* Monta os posts para mostrar na tela de acordo com os
* parametros passados para o request
* @param posts objeto com os post
* @return this
*/
Blog.prototype.updateColumns = function(posts) {
	var column, post, postContent = {};
	var countPosts = posts.size() - 2;			// retorna o total de posts da pagina
	var perColumn = this.getPerPage() / 2;		// define o numero de posts por coluna
	var postFlashs = posts.get('destaques');	// pega os destaques dos posts

	// esconde o cabecalho da busca
	this.resultSearch.hide();

	// verifica se e a primeira pagina e se tem diminuicao de posts
	// e diminui do total de posts
	if (this.getSubtract() == 2 && this.getPage() == 1)
		countPosts -= 1;

	// verifica se tem destaques, cria-os e diminui o total de posts
	if (postFlashs && postFlashs.size() > 0) {
		this.createPostFlashs(postFlashs);
		countPosts--;
	}

	// remove a classe de busca do reviewsBody
	this.reviewsBody.removeClassName('search');

	// monta os posts a partir da template e coloca na coluna correta
	for (var i = 0; i < countPosts; i++) {
		var column = i < perColumn ? 'columnLeft' : 'columnRight';
		post = posts.get(i);

		var sex = (this.getUniverse() == 'M' ? 'men' : 'women');
		var url =  'http://www.rexona.com.br/site/'+sex + '_post.php?post=' + post['idPost'];
		
		
		postContent['tag'] = sex + '-tag-' + post['tag'];
		postContent['title-tag'] = post['titulo_tag'];
		postContent['urlPost'] = url;
		postContent['target'] = post['target'];
		postContent['titulo'] = post['titulo'];
		postContent['texto'] = post['texto'].stripTags().truncate(110);
		postContent['texto'] = (postContent['texto']+'').replace(/\0/g, '0').replace(/\\([\\'"])/g, '$1');
		postContent['data'] = post['data'] + ' às ' + post['hora'] + 'h';
		postContent['post-email'] = 'modalEmailAmigo.show(this, \''+this.getUniverse()+'\', \''+post['idPost']+'\', \''+post['titulo']+'\')';
		
				
		if (post['urlBlog'])
			postContent['autor'] = '<a href="'+post['urlBlog']+'" rel="'+post['target']+'" title="'+post['autor']+'">'+post['autor']+'<\/a>';
		else
			postContent['autor'] = (this.getUniverse() == 'M' ? 'Equipe Rexona Men': 'Equipe Rexona Women');

		this.reviewsBody[column].insert(this.postTemplate.evaluate(postContent));
	};

	return this;
};

/**
* Monta os posts para mostrar na tela especificos para a busca 
* @param posts objeto com os post
* @return this
*/
Blog.prototype.updateSearch = function(posts) {
	var column, post, postContent = {};
	var countPosts = posts.size() - 2;			// retorna o total de posts da pagina

	// adiciona a classe de busca do reviewsBody (coluna da direita e escondida com essa classe)
	this.reviewsBody.addClassName('search');

	// monta os posts a partir da template e coloca na coluna da esquerda

	for (var i = 0; i < countPosts; i++) {
		post = posts.get(i);

		var sex = (this.getUniverse() == 'M' ? 'men' : 'women');
		var url =  'http://www.rexona.com.br/site/'+sex + '_post.php?post=' + post['idPost'];

		postContent['tag'] = sex + '-tag-' + post['tag'];
		postContent['urlPost'] = url;
		postContent['target'] = post['target'];
		postContent['titulo'] = post['titulo'];
		postContent['texto'] = post['texto'].stripTags().truncate(220);
		postContent['data'] = post['data'] + ' às ' + post['hora'] + 'h';
		postContent['post-email'] = 'modalEmailAmigo.show(this, \''+this.getUniverse()+'\', \''+post['idPost']+'\', \''+post['titulo']+'\')';

		if (post['urlBlog'])
			postContent['autor'] = '<a href="'+post['urlBlog']+'" rel="'+post['target']+'" title="'+post['autor']+'">'+post['autor']+'<\/a>';
		else
			postContent['autor'] = post['autor'];

		this.reviewsBody.columnLeft.insert(this.postTemplate.evaluate(postContent));
	}
	
	// mosta o cabecalho da busca
	this.resultSearch.setStyle({display: 'inline'});

	// verifica se tem resultado
	if (countPosts < 1) {
		this.reviewsBody.addClassName('nenhum-resultado');
		this.resultSearch.select('p').first().update('');

	// monta o cabecalho
	} else {
		var initial = this.getPerPage() * this.getPage() - this.getPerPage() + 1;
		var end = (initial + this.getPerPage() -1) > posts.get('total_registros') ? posts.get('total_registros') : initial + this.getPerPage() -1;

		this.resultSearch.select('p').first().update('De <strong>'+ initial +'<\/strong> até <strong>'+ end +'<\/strong>, com o total de <strong>'+ posts.get('total_registros') +'<\/strong> para <strong>"'+ this.getSearch() +'"<\/strong>.');
	}

	// define acao do botao voltar
	var back = $$('.resultado-busca .voltar').first();

	if (this.referer)
		back.writeAttribute('href',this.referer);
	else {
		back.writeAttribute('href','javascript:;')
			.observe('click', function() { this.list(true); }.bind(this));
	}

	return this;
};

/**
* Pega os posts e e define de qual metodo vao ser montados
* @param posts objeto com os post
* @return this
*/
Blog.prototype.update = function(posts) {
	this.hideColumns();

	if (this.isSearch)
		this.updateSearch(posts);
	else
		this.updateColumns(posts);

	// fixTarget();
	return this;
};


/**
* Mostra as colunas do reviewsBody
* @return this
*/
Blog.prototype.showColumns = function() {
	this.reviewsBody.columnLeft.show();
	this.reviewsBody.columnRight.show();
	
	return this;
};

/**
* Esconde as colunas do reviewsBody
* @return this
*/
Blog.prototype.hideColumns = function() {
	this.reviewsBody.columnLeft.hide();
	this.reviewsBody.columnRight.hide();

	return this;
};

/**
* Cria os destaques
* @param postFlashs objeto com os destaques
* @return this
*/
Blog.prototype.createPostFlashs = function(postFlahs) {
	
	// remove flashs antigos para que novos sejam postos em seu lugar
	$$('div.destaques').invoke('remove');
	
	for (var i = 1; i <= postFlahs.length; i++) {
	
		this.reviewsBody.insert({top:'<div class="destaques flash-'+i+'"><div id="swf-destaque-'+i+'"><\/div><\/div>'});
		swfobject.embedSWF('http:\/\/www.rexona.com.br\/site\/media\/swf\/destaque_imagem.swf','swf-destaque-'+i,'150','140','9',false,{SRVPATH:srvpath,UNIVERSO:this.getUniverse(),IDDESTAQUE:postFlahs[i - 1].idDestaque},{wmode:'transparent'},{id:'swfDestaque'+i,name:'swfDestaque'+i});
	}
	
	// atualiza a descrição da aba atual
/* 	$$('p.descricao').invoke('update', 'ahsbda sdhasd asjhda '); */
	
	return this;
};

/**
* Executa o request a partir dos paramentros definidos
* @param custom para customizar os parametros da busca (opcional)
* @return this
*/
Blog.prototype.list = function(custom) {
	// verifica se a listagem esta sendo carregada e nao executa mais nada
	if (this.isLoading) {
		this.reloadList = true;
		return this;
	}
	
	// define a class do reviewsBody
	this.reviewsBody.removeClassName('nenhum-resultado');
	
	// define as ultimas configuracoes do blog se nao foi executa uma busca
	if (!this.isSearch)
		this.lastOptions = Object.clone(this.options);

	// monta os paramentos customizados
	if (custom) {
		this.options = Object.clone(this.lastOptions);
		this.clearSearch();
	}
	
	// executa o request
	new Ajax.Request('http://www.rexona.com.br/site/blog_lista_posts.php', {
		method: 'post',
		parameters: this.getParameters(),

		// define o reviewsBody para o loading
		onCreate: function() {
			// define a classe de loading para o reviewsBody
			if (!this.reviewsBody.hasClassName('loading'))
				this.reviewsBody.addClassName('loading')

			// limpa as colunas
			this.reviewsBody.columnLeft.update('');
			this.reviewsBody.columnRight.update('');

			// define que o loading esta sendo executado
			this.isLoading = true;
		}.bind(this),

		// organiza as informacoes para montar os posts
		onComplete: function(transport) {
			var posts = $H(transport.responseText.evalJSON());			// objeto com os posts
			var pagesPosts = posts.get('total_paginas');				// numero de paginas
			

			// define a nova altura a partir da altura antiga
			this.reviewsBody.setStyle({height: this.lastHeight + 'px'});
			// define numero de paginas
			this.setNumberPages(pagesPosts);

			// verifica se nao precisa de paginacao e a remove
			if (this.getNumberPages() < 2)
				this.removePagination();

			// executa o update dos posts
			this.update(posts);

			// define nova altura para o efeito de acordo com o posts
			var leftHeight = this.reviewsBody.columnLeft.getHeight()
			var rightHeight = this.reviewsBody.columnRight.getHeight();
			this.lastHeight = (leftHeight > rightHeight ? leftHeight : rightHeight);
			this.lastHeight = this.lastHeight < 446 ? 446 : this.lastHeight;

			// efeito de aumentar o tamanho do reviewsBody, remover a
			// classe de loading e mostrar as colunas com os posts
			new Effect.Morph(
				this.reviewsBody, 
				{
					style: {height: this.lastHeight + 'px'},
					afterFinish: function() {
						this.reviewsBody.removeClassName('loading');
						this.showColumns();
					}.bind(this)
				}
			);
			
			// define que o loading nao esta mais sendo executado
			this.isLoading = false;

			// verifica se foi solicitado uma nova listagem
			if (this.reloadList) {
				this.reloadList = false;
				this.list();
			}
		}.bind(this)
	});

	return this;
};

/**
* Ativa a tag
* @param element elemento q vai ter a tag ativada
* @return Blog object
*/
Blog.prototype.activeTag = function(element) {
	$(element)
		.up().addClassName('ativo')
		.siblings().invoke('removeClassName', 'ativo');
		
	// atualiza a descricao da tag atualmente ativa
	// e modifica o banner
	if(this.getUniverse() == 'W'){ // womem
		
		if(element.innerHTML == 'Todos') {
		
			$$('p.descricao').invoke('update', 'As últimas atualizações de nosso editora e das nossas parceiras, em todas as áreas de Rexona Women.');
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/EMOTION.jpg)' });
			
		}else if(element.innerHTML == "Moda e Estilo") {
		
			$$('p.descricao').invoke('update', "Todas as notícias do mundo fashion, além de dicas de estilo que vão fazer a diferença no seu look.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/PRADA.jpg)' });
			
		}else if(element.innerHTML == "Dia-a-dia"){
		
			$$('p.descricao').invoke('update', "Novidades que facilitam seu dia a dia em casa e no escritório.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/SAMANTHA.jpg)' });
			
		}else if(element.innerHTML == "Amor e Relacionamento") {
		
			$$('p.descricao').invoke('update', "Qual mulher não gosta de uma DR? Aqui é o lugar certo.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/DELICIOUS.jpg)' });
			
		}else if(element.innerHTML == "Meu Momento"){
		
			$$('p.descricao').invoke('update', "Música, cinema, literatura e bem-estar. A pausa que você merece no meio de tanta correria.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/MARTA.jpg)' });
		}
	}
	else if(this.getUniverse()){ // man
		
		if(element.innerHTML == "Todos"){
			$$('p.descricao').invoke('update', "As últimas atualizações de nosso editor e dos nossos parceiros, em todas as áreas de Rexona Men.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/FOOTZOMBIE.jpg)' });
		}
		else if(element.innerHTML == "Fanáticos por Futebol"){
			$$('p.descricao').invoke('update', "Críticas, contratações, placares e algumas histórias menos conhecidas do nobre esporte bretão.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/FUTWORK.jpg)' });
		}
		else if(element.innerHTML == "Tech Toys"){
			$$('p.descricao').invoke('update', "Sua parada obrigatória para saber das últimas em celulares, computadores e gadgets em geral.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/QUATTRO.jpg)' });
		}
		if(element.innerHTML == "Adrenalina"){
			$$('p.descricao').invoke('update', "Esportes radicais, histórias de superação e a eterna busca por romper limites.");
			$('banner-publicidade').setStyle({ backgroundImage : 'url(http://www.rexona.com.br/site/media/images/banners/FANGIO.jpg)' });
		}
	}
	
	return this;
};

/**
* Desativa todas as tag
* @return Blog object
*/
Blog.clearTag = function() {
	$$('ul.tags li').invoke('removeClassName', 'ativo');

	return Blog;
};

Event.observe(window, 'load', function() {
	try{
		// botao todos das tags
		$$('.todos a').first().observe('click', function() { blog.changeTag(0, this); });
		
		// botao todos os weekly reviews
		$$('.weekly-review a.todos-weekly').first().observe('click', function() { blog.changeOrigin(0); });
	
		// botao ver todos dos mais clicados
		$$('.ver-todos a').first().observe('click', function() { blog.changeMoreClicked(1); });
	}catch(e){
	}
});