var Search = {
	keywordRedirections: {},
	pageSize: 6,
	maxPages: 10,
	
	onComplete: function(response) {	
		log('======= SEARCH RESULTS ======');
		log(response);

		if(response.error) {
			document.searching = false;
			$('#sclose').removeClass('loading');
			$('.searchResults').empty();
			$('.searchResults').html("<h2>"+response.error+"</h2>");
		  $('.searchResults').fadeIn();
			return;
		}

		results = response.response.docs;
		log("Results: "+results.length)
		var facets = $('.searchResults .facets');
		facets.empty();
		if(response.facet_counts) {
			$.each(response.facet_counts.facet_fields, function(k,v) {
				if(k == 'premium') {
					$.each(v, function(kk,vv) {
						if(kk == 'true') {
							link = $('<a href="#">Premium ('+vv+')</a>').click(function(){
								$('#search-facets-premium-input').val(k+':'+kk);
								Search.submit();
								return false;
							});
							facets.append(link);						
						} else {
							link = $('<a href="#">Free ('+vv+')</a>').click(function(){
								$('#search-facets-premium-input').val(k+':'+kk);
								Search.submit();
								return false;
							});
							facets.append(link);
						}
					});
				} else if(k == 'category') {
					facets.append($('<h3>Categories</h3>'))
					$.each(v, function(kk,vv) {
						if(vv == 0) {
							return;
						}
						link = $('<a href="#">'+kk+' ('+vv+')</a>').click(function(){
							$('#search-facets-category-input').val(k+':'+kk);
							Search.submit();
							return false;
						});
						facets.append(link);
					});					
				}
			});
		}		
	  var items = $('.searchResults .items')
	  items.empty();
	  $('.searchPaginator').remove();
	  var curPage = (response.response.start / Search.pageSize) + 1;
	  $.each(results, function(index, value) {
			/*
			var template_personalize_url = value.template_personalize_url;
			var cancel_casting_url = escape("/?search_q="+response.responseHeader.params.q+"&page="+curPage);
			var includes_query_string = (template_personalize_url.indexOf("?") != -1);
			if(includes_query_string) {
				template_personalize_url += "&";
			} else {
				template_personalize_url += "?";
			}
			template_personalize_url += "cancel_casting_url="+cancel_casting_url;
			*/
	    var item = $('<div class="item"></div>');
	    var thumbnail = '<a href="'+value.template_url+'">';
			var thumbnail_src = '/images/search/search_gen_logo.jpg';
			if(value.thumbnail_src) {
				thumbnail_src = value.thumbnail_src;
			}
	    thumbnail += '<img class="sr_th thumb_link" src="'+thumbnail_src+'"/></a>';
			thumbnail = $(thumbnail)
			if(value.premium) {
				var premium = $('<div class="premium">PREMIUM</div>');
				item.append(premium);
			} else {
				var free = $('<div class="free">FREE</div>');
				item.append(free);
			}
	    item.append(thumbnail);

	    var info = $('<div class="sinfo"></div>');
	    var title = $('<a></a>');
	    title.attr({href:value.template_url});
	    title.html(value.name);
	    info.append(title);
	    var mediaType = $('<div class="stype"></div>');
	    if(value.media_type == 'video') {
	      mediaType.html('Video');
	    } else {
	      mediaType.html('Image');
	    }
	    info.append(mediaType);

			if($.cookie('search_debug') && value.score) {
		    var score = $('<div class="score"></div>');
	      mediaType.html(value.score);
		    info.append(score);
			}

	    if(value.teaser_view_count) {
	      var views = $('<span class="sviews"></span>').html(formatNumberWithCommas(value.teaser_view_count) + ' views');
	      info.append(views);
	    }
    
	    item.append(info);
	    items.append(item);
	  })

	  $('.searchResults .query strong').html($('#search-input').val());

	  if (results.length == 0) {
	    $('.searchResults .items').append($('<h2>Sorry, your search returned no results.</h2>'));
	  }
	  $('.searchResults').fadeIn();        

	  Search.generatePagination(response.response);
		document.searching = false;
		$('#sclose').removeClass('loading');
	},

	submit: function(page) {
		if(!page) {
			page = 0;
		}
		if(document.searching == true) {
			return; // prevent colliding search events
		}

	  var term = $('#search-input').val();
		term = $.trim(term).toLowerCase();

		term = term.replace(/[^a-zA-Z 0-9]+/g, '')

		var redirection = Search.keywordRedirections[term];
		if(redirection) {
			trackSearchTerm(term);
			document.location = redirection;
			return false;
		}

		document.searching = true;
		$('#sclose').addClass('loading');
	
	
		data = {
			q:term,
			start:page
		}

/*		data['facet'] = 'true';
		data['facet.query'] = [term];
    data["facet.mincount"] = "0";
		data['facet.field'] = ['{!ex=premium}premium','{!ex=category}category'];
		data['json.nl'] = 'map';

		fq = [];
		premium = $('#search-facets-premium-input').val();
		if(premium) {
			fq.push('{!tag=premium}'+premium);
		}

		category = $('#search-facets-category-input').val();
		if(category) {
			fq.push("{!tag=category}"+category);
		}
		
		data['fq'] = fq;
		log(data);
*/

		data.start = page * Search.pageSize;
		$.get('/sendables/search', data, Search.onComplete, 'jsonp');
		trackSearchTerm(term);
		return false;
	},

 	generatePagination: function(results) {
		var pages = parseInt(results.numFound / Search.pageSize);
		if((results.numFound % Search.pageSize) > 0) {
			pages++;
		}
		// MAX PAGES
		if(pages > Search.maxPages) { 
			pages = Search.maxPages;
		}
	 	if(pages == 1) return;
	  var curPage = (results.start / Search.pageSize);
	  var paginationDiv = document.createElement('div');
	  $(paginationDiv).attr({class:'searchPaginator'})
	  var pagesDiv = document.createElement('div');
	  $(pagesDiv).attr({class:'pages'});
	  var pagesInnerDiv = document.createElement('div');
	  $(pagesInnerDiv).attr({class:'pagesInner'});
	  for (var i = 0; i < pages; i++) {
	    var page = i;
	    if (curPage == page) { // if we are on the curPage, then don't make a link
	      var label = document.createElement('span');
	      label.innerHTML = page + 1;
	      pagesInnerDiv.appendChild(label);
	    } else {
	      // If we aren't on the current page, then we want a link to this page.
	      var link = document.createElement('a');
				link.page = page;
				link.href = "#";
	      $(link).click(function(){
					Search.submit(this.page);
					return false;	
				});
	      link.innerHTML = page + 1;
	      pagesInnerDiv.appendChild(link);
	    }
	  }
		$(pagesDiv).append(pagesInnerDiv);
		$(paginationDiv).append(pagesDiv);
	  $('.searchResults').append(paginationDiv);

		var nextPage = curPage + 1
	  if(nextPage < pages) {
	    next = $('<a class="next" href="#">Next</a>')
	    next.click(function() {
	      Search.submit(nextPage);
	      return false;
	    })
			$(paginationDiv).append(next);
	  }

	  var prevPage = curPage - 1;
	  if(prevPage >= 0 && prevPage < pages) {
	    prev = $('<a class="prev" href="#">Prev</a>')
	    prev.click(function() {
	      Search.submit(prevPage);
	      return false;
	    })
			$(paginationDiv).prepend(prev);
	  }

		var windowSize = 10;
		var startScrollingAtPage = (windowSize / 2);
  	var pageLinkWidth = 26+4; // this should be the width+padding, keep in sync with css.
		var pagesWidth = pages * pageLinkWidth;
/*		if(windowSize <= (results.numFound)) {
			pagesWidth = pages;
		}
*/		
		var pagesInnerWidth = pages * pageLinkWidth;
				
		$('.searchPaginator').css('width', pagesWidth + (pageLinkWidth * 2)) // +2 for next/prev links
		$('.searchPaginator .pages').css('width', pagesWidth)
		$('.searchPaginator .pagesInner').css('width', pagesInnerWidth)

/*		shouldStartScrolling = (curPage > startScrollingAtPage);

		left = parseInt($('.searchPaginator .pagesInner').css('left'));
		if(shouldStartScrolling) {
			newLeft = (left - (pageLinkWidth * (curPage - startScrollingAtPage)));
			$('.searchPaginator .pagesInner').css({left:newLeft})
		}

		shouldEndScrolling = (curPage > (pages - startScrollingAtPage));
		if(shouldEndScrolling) {
			$('.searchPaginator .pagesInner').css({left:'null', right:'0px'})
		}
*/	
	},

	closeResults: function() {
		if(getUrlParameters().search_q) { // pretty much just used for debugging
			return;
		}
	  $('#search-input').val('');
	  $('.searchResults').hide('slow'); 
	}
}

$(document).ready(function() {
	$('#searchForm form').submit(function(){
		Search.submit();
		return false;
	})
	$('#search-submit').click(function(){
		Search.submit();
		return false;
	})
	
	var mouse_is_inside_results=false;
	var mouse_is_inside_form=false;
	
	$('.searchResults').hover(function() {
		mouse_is_inside_results=true; 
	}, function(){ 
		mouse_is_inside_results=false; 
	});

	$('#searchForm').hover(function() {
		mouse_is_inside_form=true; 
	}, function(){ 
		mouse_is_inside_form=false; 
	});

	$('body').mouseup(function(){ 
    if(!mouse_is_inside_results && !mouse_is_inside_form) {
      Search.closeResults();
    } 
	});

  var search_q = getUrlParameters().search_q;
  if(search_q) {
    $('#search-input').val(search_q);
		var page = parseInt(getUrlParameters().page);
		if(page > 0) {
			page--;
		}
    Search.submit(page);
  }
});
