// make autocomplete custom component
$.widget('.searchAutocomplete', $.ui.autocomplete, {
	_renderMenu: function(ul, items) {
		var self = this, currentGroup = '';
		$.each(items, function(index, item) {
			if (item.type != currentGroup) {
				if (item.type=='t')
					ul.append('<li class="group"><span>Sugestões de resultados</span></li>');
				else
					ul.append('<li class="group"><span>Sugestões de produtos</span></li>');
				currentGroup = item.type;
			}
			self._renderItem(ul, item);
		});
	},
	_renderItem: function(ul, item) {
		var content;
		var term = '('+$('#'+solrSearchAutoComplete.inputAutoComplete).data('searchAutocomplete').term+')';
		item.label = item.label.replace(new RegExp(term, 'gi'), '<strong>$1</strong>');

		// valida se termo ou produto
		if (item.type=='t') {
			content = '<a>+ '+item.label+' <span class="gray">('+item.occurrences+')</span></a>';
			return $('<li class="term"></li>').data('item.autocomplete', item).append(content).appendTo(ul);
		} else {
			content =	'<a>'+
							'<span class="image"><img src="'+item.image+'" width="59px" height="44px" /></span>'+
							'<span class="title">'+item.label+'</span>';
			if (!item.soldOut)
				content += '<span class="price"><strong>'+formatNumber(item.price, true)+'</strong> '+item.priceDescription+'</span>';
			else
				content += '<span class="souldOut" title="produto esgotado">Produto esgotado</span>';
			content += '</a>';
			return $('<li class="product"></li>').data('item.autocomplete', item).append(content).appendTo(ul);
		}
	}
});

var solrSearchAutoComplete = {
	server: '',
	infoText: 'Encontre o que procura',
	inputAutoComplete: 'txtSearchTerms',
	buttonAutoComplete: 'btnSearch',
	redirected: false,
	bindEvents: function() {
		$('#'+this.inputAutoComplete).val(solrSearchAutoComplete.infoText).focus(function(){
			if ($(this).val() == solrSearchAutoComplete.infoText) {
				$(this).val('');
				$(this).addClass('focus');	
			}
		}).blur(function(){
			if ($(this).val() == '') {
				$(this).val(solrSearchAutoComplete.infoText);
				$(this).removeClass('focus');
			}
		});

		enterPressed('#'+this.inputAutoComplete, function(){ solrSearchAutoComplete.search(); });
		$('#'+this.buttonAutoComplete).click(function(){ solrSearchAutoComplete.search(); });
	},
	search: function() {
		if ($('#'+this.inputAutoComplete).val() != this.infoText && $('#'+this.inputAutoComplete).val() != '') {
			var urlObj = new Object();
			urlObj.q = escape($('#'+this.inputAutoComplete).val().trim());
			this.location(friendlyUrl.search(urlObj));
		}
	},
	location: function(url) {
		if (this.redirected == false) {
			this.redirected = true;
			window.location = url;
		}
	},
	init: function() {
		this.bindEvents();

		$('#'+this.inputAutoComplete).searchAutocomplete({
			appendTo: '.search',
			minLength: 2,
			delay: 300,
			position: {my:'left top',at:'left bottom',collision:'none', offset:'-28px 3px'},
			open: function() {
				$('.search .ui-autocomplete .group:gt(0)').addClass('space');
				$('.search .ui-autocomplete .product:last').addClass('last');
			},
			source: function(request, response ) {
				var terms = new Array();
				var products = new Array();
				var requestTermsComplete = false;
				var requestProdsComplete = false;

				$('.search .load').show();

				// Terms
				$.ajax({
					url: solrSearchAutoComplete.server+'/t/',
					cache: false,
					dataType: 'jsonp',
					crossDomain: true,
					jsonp: 'json.wrf',
					data: {
						'terms.fl':'terms',
						'terms.prefix':request.term,
						'terms.limit':5,
						'terms.regex.flag':'case_insensitive',
						'wt':'json',
						'indent':'off',
						'omitHeader':false
					},
					success: function(data) {
						requestTermsComplete = true;

						if (data.responseHeader.status==0) {
							for (var i=0;i<data.terms.terms.length;i+=2) {
								terms.push(
									{
										type:'t',
										label:data.terms.terms[i],
										value:data.terms.terms[i],
										occurrences:data.terms.terms[i+1]
									}
								);
							}
						}
						if (requestProdsComplete) {
							if (products.length > 0)
								terms = terms.concat(products);
							$('.search .load').hide();
							response (terms);
						}
					},
					error: function() { requestTermsComplete = true; }
				});

				// objeto para busca de produtos
				var psdata = new Object();
				psdata.q = request.term;
				psdata.start = 0;
				psdata.rows = 5;
				psdata.sort = 'sold_out asc,score desc';
				psdata.indent = 'off';
				psdata.wt = 'json';
				// valida se foi realizada uma busca direto pelo código do produto
				if ((request.term.length == 7 || request.term.length == 9) && !isNaN(request.term))
					psdata.qf = 'searchable_code';

				// Products
				$.ajax({
					url: solrSearchAutoComplete.server+'/s/',
					cache: false,
					dataType: 'jsonp',
					crossDomain: true,
					jsonp: 'json.wrf',
					data: psdata,
					success: function(data) {
						requestProdsComplete = true;

						if (data.responseHeader.status == 0 && data.response.docs.length > 0) {
							for (var i=0; i<data.response.docs.length;i++) {
								var product = data.response.docs[i];
								var urlObj = new Object();
								urlObj.produto = product.code;
								urlObj.modelo = product.model;
								urlObj.linha = product.category_id;
								urlObj.setor = product.subcategory_id;
								urlObj.descricaoproduto = friendlyUrl.stringReplace(product.title+'-'+product.reference);

								products.push(
									{
										type : 'p',
										label: product.title+' - '+product.reference,
										value: product.title,
										image: imageUrl.getProductPpiImgUrl(product.id),
										price: product.cash_price,
										priceDescription: product.cash_price_description,
										soldOut: product.sold_out,
										link: friendlyUrl.product(urlObj)
									}
								);
							}
						}
						if (requestTermsComplete) {
							if (products.length > 0)
								terms = terms.concat(products);
							$('.search .load').hide();
							response (terms);
						}
					},
					error: function() { requestProdsComplete = true; }
				});
			},
			select: function(event, ui) {
				if (ui.item.type == 't') {
					var urlObj = new Object();
					urlObj.q = escape(ui.item.value);
					solrSearchAutoComplete.location(friendlyUrl.search(urlObj));
				} else
					solrSearchAutoComplete.location(ui.item.link);
			}
		})
	}
}
