$(document).ready(function () {
	// variables
	var methods = {};
	var resultsData = [];
	var filteredData = [];
	// reusable page elements
	var $overview = $("#overview");
	var $searchResults = $("#search_results");
	var $searchResultsData = $("#search_results_data");
	var $topicFilter = $("#topic_filter");
	var $typeFilter = $("#type_filter");
	var $pager = $("#pager");
	var $searchTypeMessage = $("#search_type_message");
	var $itemsInfo = $("#items_info");
	//var $pageInfo = $("#page_info");
	var pageSize = 10;
	var pageAdjacents = 2;
	var topicFilter = "all";
	var typeFilter = "all";
	var pageMessage = "";
	var itemsMessage = "";
	var dateFormat = "MM d, yy";
	// methods
	methods.sortPubDateDesc = function(a, b) {
		return b.pub_date - a.pub_date;
	};
	methods.populateResearchData = function(data) {
		$(data).each(function() {
			resultsData.push(this);
			filteredData.push(this);
		});
	};
	methods.setFilterSelected = function(element, filterName) {
		if ($(element).parent().get(0).tagName.toLowerCase() == "li") {
			if (methods.parseFilter(element) == filterName) {
				$(element).parent().addClass("selected");
			} else {
				$(element).parent().removeClass("selected");
			}
		}
	};
	methods.fillSearchResults = function(page) {
		$searchResults.hide();
		$searchResultsData.empty();
		var list = "";
		var pageIndex = ((page-1)*pageSize);
		var loopSize = (pageIndex + pageSize > filteredData.length) ? filteredData.length : pageIndex + pageSize;
		var pubDate;
		var itemsMessage = "Showing " + (pageIndex+1) + '-' + loopSize + ' of ' + filteredData.length;
		if (filteredData.length <= 0) {
			itemsMessage = "";
			list = "<li>No Documents Found.</li>";
		}
		for (var i = pageIndex; i<loopSize; i++) {
			row = filteredData[i];
			publishedDate = $.datepicker.formatDate(dateFormat, new Date(row.pub_date*1000));
			list += "<li class=\"" + row.types[0]  + "\"><a href=\"research/research_articles/" + row.alias + "\">" + row.typeLabel + "<p>" + row.longtitle;
			if (row.introtext != null && row.introtext != "") {
				list += " <span>"  + row.introtext + "</span>";
			}
			list += "</p></a></li>";
		}
		$searchResultsData.html(list);
		methods.buildPager(page);
		methods.displayFilterMessage();
		$itemsInfo.html(itemsMessage);
		$overview.hide();
		$typeFilter.children().find("a").each(function() {methods.setFilterSelected(this, typeFilter);});
		$topicFilter.children().find("a").each(function() {methods.setFilterSelected(this, topicFilter);});
		$searchResults.show();
	};
	methods.parseFilter = function(element) {
		return $(element).html().toLowerCase().replace(/ /g, "_"); 
	};
	methods.filterData = function() {
		filteredData = [];
		if (typeFilter == "recently_added") {
			resultsData.sort(methods.sortPubDateDesc);
			filteredData = resultsData.slice(0, 5);
		}
		$.each(resultsData, function() {
			if ((typeFilter == "all" || $.inArray(typeFilter, this.types) >= 0) &&
					(topicFilter == "all" || $.inArray(topicFilter, this.topics) >= 0)) {
				filteredData.push(this);
			}
		});
	};
	methods.buildPager = function(currentPage) {
		$pager.hide();
		$pager.empty();
		var pagerRows = "";
		var pages = Math.ceil(filteredData.length / pageSize);
		var pageStart = (currentPage > pageAdjacents) ? currentPage - pageAdjacents : 1;
		var pageEnd = (currentPage > pageAdjacents) ? currentPage + pageAdjacents : 1 + pageAdjacents*2;
		if (pageEnd > pages) {
			pageEnd = pages;
			pageStart = pageEnd - pageAdjacents*2;
		}
		if (pages < (pageAdjacents*2) +1) {
			pageStart = 1;
			pageEnd = pages;
		}
		pageMessage = (pages <= 0) ? "" : "Showing page " + currentPage + " of " + pages;
		for (var i=pageStart; i<=pageEnd; i++) {
			pagerRows += "<li";
			if (i == currentPage) {
				pagerRows += " class=\"current-page\"";
			}
			pagerRows += "><a href=\"#\">" + i + "</a></li>";
		}
		$pager.html(pagerRows);
		$pager.children().each(function(index) {
			$(this).find("a").bind('click', {page: index+pageStart}, function(e) {
				methods.fillSearchResults(e.data.page);
				return false;
			});
		});
		if (currentPage > 1) {
			$pager.prepend("<li><a href=\"#\">Previous</a></li>").click(function() {
				methods.fillSearchResults(currentPage-1);
				return false;
			});
		}
		if (currentPage != pages && pages != 0) {
			$pager.append("<li><a href=\"#\">Next</a></li>").click(function() {
				methods.fillSearchResults(currentPage+1);
				return false;
			});
		}
		//$pageInfo.html(pageMessage);
		$pager.show();
	};
	methods.formatFilterMessage = function(filter) {
		var message = "";
		var messageSplit = filter.replace(/\_/g, " ").split(" ");
		for(var c=0; c < messageSplit.length; c++) {
            message += messageSplit[c].substring(0,1).toUpperCase() + messageSplit[c].substring(1,messageSplit[c].length) + ' ';
			if (message == "Nyu-poly ") {
				message = "NYU-Poly ";
			}
		}
		return message;
	};
	methods.displayFilterMessage = function() {
		if (typeFilter != "recently_added") {
			$searchTypeMessage.html(" " + methods.formatFilterMessage(topicFilter) + " + " + methods.formatFilterMessage(typeFilter));
		} else {
			$searchTypeMessage.html(" " + methods.formatFilterMessage(typeFilter));
		}
	};
	methods.handleFilterClickEvent = function(element, filter) {
		if (filter == "topic") {
			topicFilter = methods.parseFilter(element);
		} else {
			typeFilter = methods.parseFilter(element);
		}
		methods.filterData();
		methods.fillSearchResults(1);
		return false;
	};
	methods.handleOverviewSeeAllClick = function(element) {
		typeFilter = $(this).parent().attr("class");
		topicFilter = "all";
		
		methods.filterData();
		methods.fillSearchResults(1);
		return false;
	};
	// event binding
	$topicFilter.children().find("a").bind('click', function() { return methods.handleFilterClickEvent(this, "topic");});
	$typeFilter.children().find("a").bind('click', function() { return methods.handleFilterClickEvent(this, "type");});
	$("#overview").find("a").bind('click', methods.handleOverviewSeeAllClick);
	// ajax calls
	$.getJSON("/research/research-json", {}, methods.populateResearchData);
});