/*
 * Formata uma data do formato Solr
 * YYYY-MM-DDTHH:II:SSZ
 * para o formato descrito no parametro _formato_
 *
 * Exemplo: 
 * solr_formatar_data("2010-10-31T10:33:00Z",
 *							"$3/$2/$1 $4:$5:$6")
 *
 * retornara "31/10/2010 10:33:00"
 */ 
function solr_formatar_data (data, formato) {
	var ext = /^(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)Z$/.exec(data);
	var utc = new Date();
	utc.setUTCFullYear(ext[1]);
	utc.setUTCMonth(parseInt(ext[2], 10) - 1);
	utc.setUTCDate(ext[3]);
	utc.setUTCHours(ext[4]);
	utc.setUTCMinutes(ext[5]);

	var mon = zero_pad(parseInt(utc.getMonth(), 10) + 1);
	var day = zero_pad(utc.getDate());
	var hour = zero_pad(utc.getHours());
	var min = zero_pad(utc.getMinutes());
	
	local = utc.getFullYear() + '-' +
				mon + '-' + day + '-' +
				hour + '-' + min;
				
	
	return local.replace(/^(\d+)-(\d+)-(\d+)-(\d+)-(\d+)$/,
								formato);
}

function zero_pad (num) {
	if (num < 10)
		num = '0' + num;
		
	return num;
}

function sanitizar_termos (termos) {
	var r = decodeURI(termos).toLowerCase();
	r = r.replace(new RegExp(/(\s|\+)+/g)," ");
	r = r.replace(new RegExp(/[àáâãäå]/g),"a");
	r = r.replace(new RegExp(/æ/g),"ae");
	r = r.replace(new RegExp(/ç/g),"c");
	r = r.replace(new RegExp(/[èéêë]/g),"e");
	r = r.replace(new RegExp(/[ìíîï]/g),"i");
	r = r.replace(new RegExp(/ñ/g),"n");    
	r = r.replace(new RegExp(/[òóôõö]/g),"o");
	r = r.replace(new RegExp(/œ/g),"oe");
	r = r.replace(new RegExp(/[ùúûü]/g),"u");
	r = r.replace(new RegExp(/[ýÿ]/g),"y");
	r = r.replace(new RegExp(/[^a-z0-9 ]/g),"");
	return r;
}

function und (val) {
	return (typeof val == "undefined");
}

function trim (val) {
	return val.replace(/^\s+/, '')
							.replace(/\s+$/, '');
}

function gerar_link (item) {
	var link_attrs = (	
			(item.tipo == 'MiGGaleria_C') ?
				"onclick=\"abrirFotoshow('" + item.url + "')\" href=\"javascript:void(0)\"" :
				"href=\"" + item.url + "\"");	
	
	return '<a class="' + corLink + '" ' + link_attrs + '">';
}

// Limita o olho a um numero limite de caracteres,
// inserindo a sequencia '...' no fim, mas sem
// quebrar palavras
function limitar_texto (texto, limite) {
	if (texto.length <= limite)
		return texto;
		
	var limitado = texto.substr(0, limite);
	
	if (!/[!?,.;: ]/.test(texto.charAt(limite))) {
		limitado = /^(.*[^!?,.;:])[!?,.;: ]/.exec(limitado)[1];
	}
	
	limitado += '...';
	return limitado;
}

// Classe para lidar com o empilhamento na pagina
function Empilhamento () {}

$.extend(Empilhamento.prototype, 
	{
		manager: null,
		opts: null,
		page_size: null,
		url: {
			orig_path: null,
			path: null,
			hash_map: null
		},
		
		/*
		 * Habilita a funcionalidade de empilhamento
		 * na pagina atual
		 */
		install: function (solr_url, 
									callbk_handle_path,
									callbk_handle_hash,
									opts) {
			opts = Empilhamento.normalize_opts(opts);
			this.opts = opts;
			
			this.manager = new AjaxSolr.Manager(
								{
									solrUrl: solr_url
								});
			this.manager.init();	
			
			// Instala o widget de empilhamento
			this.manager.addWidget(
				new Empilhamento.WGT_DEFAULT(
					{
						id: 'empilhamento',
						target: '#empilhamento-resultados' 
					})
				);
				
			if (opts.paginado) {
				// Instala o widget de paginacao
				this.manager.addWidget(
					new Empilhamento.WGT_PAGINATION(
						{
							id: 'paginacao',
							target: '#paginacao',
							page_size: opts.page_size
						})
					);
			}	
			
			this.parse_path();		
			callbk_handle_path(this.url.path);			
			this.enable_history(callbk_handle_hash);
		},
		
		/*
		 * Obtem o caminho da url atual, que sera tratado 
		 * depois pela implementacao
		 */
		parse_path: function () {
			this.url.path = this.url.orig_path = location.pathname;
		}, 
		 	
		/*
		 * Habilita o plugin de historico de ajax,
		 * 	que automaticamente chama o metodo para tratar
		 * o hash inicial da url 
		 */
		enable_history: function (callbk_handle_hash) {
			var self = this;
			$.history.init(
				function (hash) { 
					self.handle_hash_change(hash) ;
					callbk_handle_hash(self.url.hash_map);
				});
		},		
		
		/*
		 * Trata a mudanca no hash (#...) da url,
		 * quando detectada
		 */
		handle_hash_change: function (hash) {
			this.parse_hash(hash);
		}, 
		
		/*
		 * Converte um hash de url em um mapa
		 * de chave e valor
		 */
		parse_hash: function (hash) {
			hash = trim(hash);
			if (hash == '') {
				this.url.hash_map = {pagina: 1};
				return;
			}
			
			/*
			 * Procura pelo formato
			 * [#pagina],key1=val1,key2=val2,...
			 */
			var ext = /^(\d*)(([^=]+=[^,]*(,|$))*)$/.exec(hash);
			if (!ext) {
				this.url.hash_map = {pagina: 1};
				return;
			}

			var map = {
				pagina: (ext[1] == '') ? 1 : ext[1]
			};
			
			this.url.hash_map = map;
			
			if (ext[2]) {
				/*
				 * Quebra o hash em parametros para
				 * popular o mapa
				 */
				var kv = ext[2].split(',');
				var ini = (ext[1] == '' ? 0 : 1);
				for (var i = ini; i < kv.length; i++) {
					var entry = kv[i].split('=');					
					map[entry[0]] = entry[1];
				}
			}
		},

		/*
		 * Uma vez que o store do manager esta' carregado
		 * com os argumentos de busca, envia a requisicao
		 * ao solr
		 */		
		load_results: function () {
			if (this.opts.paginado) {
				this.manager.store.get('start').val(
						(this.url.hash_map.pagina - 1) * this.opts.page_size);
				this.manager.store.get('size').val(this.opts.page_size);
			}
						
			this.manager.doRequest();			
		},		
		
		/*
		 * Monta a url de empilhamento a partir do objeto
		 * url e a chama no browser
		 */
		go: function () {
			var url = this.url;			
			var	 str_hash = 	this.serialz_hash();
			
			if (url.path == url.orig_path) {
				$.history.load(str_hash);
				
			} else {
				var loc = '';
				
				if (url.path != '')
					loc += url.path;
					
				if (str_hash != '')
					loc += '#' + str_hash;	

				window.location = loc;
			}
		},
		
		/*
		 * Converte o mapa de hash em uma string
		 * a ser utilizada na url
		 */	
		serialz_hash: function () {
			var hash = this.url.hash_map;
			var serial = '';
			
			if (!und(hash.pagina) && hash.pagina != 1)
				serial += hash.pagina;

			$.each(hash,
				function (k, v) {
					if (k != 'pagina' &&
							typeof v != 'function') {
						if (serial != '')
							serial += ',';
							
						serial += k + '=' + v;
					}
				});
				
			return serial;
		}
	});	
	
Empilhamento.single = null;
		
Empilhamento.singleton = function () {
	var E = Empilhamento;
	if (!E.single)
		E.single = new Empilhamento();

	return E.single; 
};
		
/*
 * Define o valor padrao nas opcoes
 * nao passadas pelo usuario
 */
Empilhamento.normalize_opts = function (opts) {
	if (und(opts))
		opts = {};
		
	if (und(opts.paginado))
		opts.paginado = true;
		
	if (und(opts.page_size))
		opts.page_size = 10;
		
	return opts;
};

Empilhamento.WGT_DEFAULT = AjaxSolr.AbstractWidget.extend(
	{
		afterRequest: function () {
			// Limpa os resultados anteriores
			$(this.target).empty();
				
			var docs = this.manager.response.response.docs;
			
			if (docs.length == 0) {
				$(this.target).append(
					'<li>Não foi encontrado conteúdo referente à sua busca.</li>');
			
			} else {			
				for (var i = 0; i < docs.length; i++) {
					var doc = docs[i];
					doc._indice = i;
					$(this.target).append(AjaxSolr.theme(
							'empilhamento',
							doc));	
				}
			}
			window.scrollTo(0, 0);
		}
	});

Empilhamento.WGT_PAGINATION = AjaxSolr.AbstractWidget.extend(
	{
		afterRequest: function () {
			var pag = Empilhamento.singleton().url.hash_map.pagina;
			// Limpa e recria a paginacao				
			$(this.target).empty();
			$(this.target).append(
					this.criar_paginacao(pag, this.manager.response.response.numFound));
		},
		
		criar_paginacao: function (pagina, num_results) {
			var ultima_pg = Math.ceil(num_results / this.page_size);	
			if (pagina > ultima_pg) return '';	
			
			var inicio = (Math.ceil(pagina / 10) - 1) * 10 + 1;
			var fim = inicio + 9;
			
			if (fim > ultima_pg) fim = ultima_pg;
			if (inicio > fim) return '';
		
			var out;
			
			if (pagina == 1) {
				out = '<li class="desativado">‹ Anterior</li>';
			} else {
				out = '<li class="ativado">' +
						'<a href="javascript:void(0)" onclick="to_page(' + (pagina - 1) + ')">' +
						'‹ Anterior</a></li>';
			}
		
			for (var i = inicio; i <= fim; i++) {
				out += '<li><a href="javascript:void(0)" ' +
							'onclick="to_page(' + i + ')"' +
							(pagina == i ? ' class="habilitar"' : '') + '>' +
							i + '</a></li>';
			}	
		
			if (pagina == ultima_pg) {
				out += '<li class="desativado">Próximo ›</li>';
			} else {
				out += '<li class="ativado">' +
						'<a href="javascript:void(0)" onclick="to_page(' + 
						(parseInt(pagina) + 1) + ')">' +
						'Próximo ›</a></li>';
			}
			
			out = out.replace(/to_page/g, 'Empilhamento.WGT_PAGINATION.go_to_page');			
			
			return out;
		}
	});	

Empilhamento.WGT_PAGINATION.go_to_page = function (num) {
	var emp = Empilhamento.singleton();
	emp.url.hash_map.pagina = num;
	emp.go();
} 


/*
* Retorna o nome da classe CSS do icone
* de tipo de conteudo do item de empilhamento,
* baseado no item passado
*/
function class_icone (item) {
	if (tem_foto(item))
		return 'foto';
	else if (item.tipoConteudo == 'videos' ||
				item.tipoConteudo == 'multimidia')
		return 'video';
	else
		return 'texto';
}

/* 
* Retorna se o item do empilhamento tem uma
* foto a ser apresentada
*/
function tem_foto (item) {
	return (item.tipo == 'MiGGaleria_C' ||
			item.tipoConteudo == 'fotos');
} 


