
/*
FILE CONCAT ADD FILE
PATH: /fidelity/../RESOURCES/client/TimerManager.js
*/

/*
FILE CONCAT ERROR!
PATH NOT FOUND: /fidelity/../RESOURCES/client/TimerManager.js
*/

/*
FILE CONCAT ADD FILE
PATH: /fidelity/fixed_income/client/search.js
*/
var SearchPage = {

	init : function() {
		SearchPage.state = SearchPage.HashToState();
		this.addDropdowns();
		this.addDatePickers();
		this.bindEvents();
		SearchPage.fetchReports();

		if (SearchPage.state.market == "Corporate") {
			$(".industryReviewOption").show();
		}

		if (SearchPage.state.market == "IndustryReportCard") {
			$(".industryReviewOption").show();
			$("#industryReview").prop("checked", true);
		}
	},

	addDatePickers : function() {
		var today = new Date(),
			minDate = '-2y',
			fromDate = $("#FromDate"),
			toDate = $("#ToDate");


		var fromPicker = fromDate.datepicker({
			showAnim	: '',
			minDate		: minDate,
			maxDate		: today,
			defaultDate	: minDate,
			dateFormat	: 'mm-dd-yy',
			onSelect	: function(date) {
				toDate.datepicker('option', {minDate : date});
				SearchPage.updateHash(toDate.val(), 'ToDate');
				SearchPage.updateHash(date, 'FromDate');
				SearchPage.fetchReports();
			}
		}).datepicker('setDate', SearchPage.state.FromDate || minDate);

		var toPicker = toDate.datepicker({
			showAnim	: '',
			minDate		: minDate,
			maxDate		: today,
			defaultDate	: today,
			dateFormat	: 'mm-dd-yy',
			onSelect	: function(date) {
				fromDate.datepicker('option', {maxDate : date});
				SearchPage.updateHash(fromDate.val(), 'FromDate');
				SearchPage.updateHash(date, 'ToDate');
				SearchPage.fetchReports();
			}
		}).datepicker('setDate', SearchPage.state.ToDate || today);

	},

	addDropdowns : function() {

		var firmsDD = new UI.DropDown();
		var marketDD = new UI.DropDown();
		var chosenMarket = SearchPage.state.market;

		// If IndustryReview checkbox selected, market dropdown won't matchup. Hack the value privately
		if (chosenMarket == "IndustryReportCard") {
			chosenMarket = "Corporate";
		}

		var dropDownChanged = function(value, searchTerm) {
			SearchPage.updateHash(value, searchTerm);
			SearchPage.updateHash(1, 'firstRow');
			SearchPage.fetchReports();
		};

		firmsDD.init({
			initVal: SearchPage.state.firm,
			element : $("#firmSelector"),
			onchange : function(value) {
				dropDownChanged(value, 'firm');
			},
			options : DropDownOptions.FirmsDM,
			unselectedLabel : "Select a Value",
			context: this
		});

		marketDD.init({
			initVal: chosenMarket,
			element : $("#marketSelector"),
			onchange : function(value) {
				dropDownChanged(value, 'market');

				$("#industryReview").prop("checked", false);  //Ensures that if Corporate is selected, then selected again, box unchecks. Otherwise, input changes and still checked
				if (value == "Corporate") {
					$(".industryReviewOption").show();
				} else {
					$(".industryReviewOption").hide();
				}
			},
			options : DropDownOptions.Markets,
			unselectedLabel : "Select a Value",
			context: this
		});

		firmsDD.draw();
		marketDD.draw();
	},

	state : {},

	updateHash : function(value, searchTerm, preventReload) {
		SearchPage.state[searchTerm] = value;

		if (!preventReload) {
			location.hash = SearchPage.StateToHash();
		}
	},

	StateToHash : function() {
		var hash = [];

		for (var prop in SearchPage.state) {
			if (SearchPage.state[prop]) {
				hash.push([prop, '=', SearchPage.state[prop]].join(''));
			}
		}

		return hash.join('&');
	},

	HashToState : function() {
		var toDate = SearchPage.GetDaysAgo(0),
			fromDate = SearchPage.GetDaysAgo(365),
			defaults = {market: 'ALL', firm: 'ALL', FromDate: fromDate, ToDate: toDate, firstRow: 1, range: 15, sort: "date", dir: "desc"};
		if (!location.hash) { return defaults; }

		var paramPairs = location.hash.replace("#","").split("&");

		for (var i = 0; i < paramPairs.length; i++) {
			var tempArr = paramPairs[i].split("=");
			defaults[tempArr[0]] = tempArr[1];
		}

		// Input could be either DM input formatted (Hightower) or DMSourceID (HIGHTOWERREPORT). Use FirmsMap to get input into DM input formatted
		defaults.firm = DropDownOptions.FirmsMap[defaults.firm];

		return defaults;
	},

	GetDaysAgo : function(numDays) {
		var now = new Date;
			now.setDate(now.getDate()-numDays);
		
		var date = now.getDate(),
			month = now.getMonth()+1,
			year = now.getFullYear();
		
		if (date < 10) { date = "0" + date; }
		if (month < 10) { month = "0" + month; }
		
		return month + "-" + date + "-" + year;
	},

	fetchReports : function() {
		var params = SearchPage.HashToState();
		ResultsTable.startLoader();

		this.fetchAjax = $.ajax({
			url: 'ajax/getReports.asp',
			data: params,
			type: 'POST',
			dataType: 'text',
			dataFilter: function(data, type) {
				var o = null;
				eval("o = " + data);
				return o;	
			},
			success: function(data) {
				ResultsTable.stopLoader();

				if (data.results[1].numResults !== 0) {
					ResultsTable.drawTable(data.results[0], data.results[1].numResults, null, data.results[2].isLoggedIn);
					ResultsTable.drawPagination(data.results[1].numResults);
					ResultsTable.scrollTo(0);  //Scroll back to top of page (small screens || if range is set high)
				} else {
					ResultsTable.drawError(null);
				}
			},
			error: function(error, test, err){
				ResultsTable.stopLoader();
				ResultsTable.drawError(error);
			}
		});
	},

	bindEvents : function() {
		var self = this;
		$("#opener").click(function(){
			$("#filters div.controls").toggle();
			$("#opener div").toggleClass("closed");
		});


		/*
		 * http://localhost/fidelity-project-1/fidelity_8.0/fixed_income/search.asp
		 * When Market = "Corporate" the "Industry Review" checkbox appears.
		 */
		$(document).on("change", "#industryReview", function(e) {
			if ($("input:checked").length > 0) {
				SearchPage.updateHash('IndustryReportCard', 'market');
				SearchPage.fetchReports();	
			} else {  //Return to (previous) Corporate state
				SearchPage.updateHash('Corporate', 'market');
				SearchPage.fetchReports();	
			}
		});


		$("#keyword").val(SearchPage.state.keyword).bind('keyup', function(e) {
			var inputValue = this.value;

			if (self.fetchAjax && self.fetchAjax.abort) { self.fetchAjax.abort(); }
			window.clearTimeout(self.keyupTimer);

			self.keyupTimer = window.setTimeout(function(){
				SearchPage.updateHash(inputValue, 'keyword');
				SearchPage.updateHash(1, 'firstRow');
				SearchPage.fetchReports();		
			}, 100);
		});


		/*
		 * http://localhost/fidelity-project-1/fidelity_8.0/markets_sectors/search.asp
		 * "Reports Search" Results column sorts
		 */
		$(document).on("click", "#resultsTable .sortField", function(evt) {
			var sortField = $(this).attr("id"),
				sortDirection;

			if (sortField == SearchPage.state.sort) {
				sortDirection = (SearchPage.state.dir == "asc") ? "desc" : "asc";
			} else {
				sortDirection = "asc";
			}

			SearchPage.updateHash(sortField, 'sort', true);
			SearchPage.updateHash(sortDirection, 'dir');
			SearchPage.updateHash(1, 'firstRow');
			SearchPage.fetchReports();
		});


		/*
		 * http://localhost/fidelity-project-1/fidelity_8.0/markets_sectors/search.asp
		 * "Reports Search" Results pagination
		 */
		$(document).on("click", ".pagination a", function(evt) {
			var firstRow = $(this).attr("id");
			SearchPage.updateHash(firstRow, 'firstRow');
			SearchPage.fetchReports();
		});
	}
};

var ResultsTable = {
	startLoader : function() {
		this.loader = new Loader({
			element : $("#reportsTable"),
			showLoader : true
		});
		this.loader.start();
	},


	stopLoader : function() {
		this.loader.stop();
	},


	drawTable : function(documents, matches, params, isLoggedIn) {
		var html = [];

		var curResultsStart = parseInt(SearchPage.state.firstRow),
			curResultsEnd = curResultsStart + (parseInt(SearchPage.state.range) - 1), //Only showing 15 at a time
			lockSpan = "";
		
		// Don't show "Results 1-15 of 3", instead "Results 1-3 of 3"
		if (curResultsEnd > matches) {
			curResultsEnd = matches;
		}

		if (!isLoggedIn) {
			lockSpan = " <span class='auto-padlock'><img alt='' title='Log in required' src='https://www.fidelity.com/products/fixedincome/images/lock_green.gif' style='height: 10px; width: 8px;'></span>";
		}

		html.push(
			"<h3>Results " + curResultsStart + "-" + curResultsEnd + " of " + matches + "</h3>",
			"<table id='resultsTable' ltag='VSMODULE^FIR Reports Search~VSEVENT^FIR Event~VSDESC^Search'>",
				"<tr>",
					"<!-- isLoggedIn:" + isLoggedIn + " -->",
					"<th class='date'><a href='javascript:void(0);' id='date' class='sortField'>Date</a></th>",
					"<th class='report'><a href='javascript:void(0);' id='report' class='sortField'>Report (PDF)</a>" + lockSpan + "</th>",
					"<th class='firm'><a href='javascript:void(0);' id='firm' class='sortField'>Firm</a></th>",
					// "<th class='market lastCell'><a href='javascript:void(0);' id='market' class='sortField'>Market</a></th>",  //Sorting disabled on this field
					"<th class='market lastCell'>Market</th>",
				"</tr>"
		);

		for (var i = 0; i < documents.length; i++) {
			var thisStory = documents[i];
			html.push(
				"<tr>",
					"<td>", thisStory.DocumentDate, "</td>",
					"<td><a target='_blank' href='../research/reports/pdf/getReport.asp", thisStory.PDFQueryString, "' ltag='VSMODULE^FIR Report Results~VSEVENT^FIR Event~VSDESC^Rpts'>",thisStory.HEADLINE, "</a></td>",
					"<td>", thisStory.DMSourceID, "</td>",
					"<td class='lastCell'>", thisStory.DocumentType.replace(/[|]/g, ", "), "</td>",
				"</tr>"
			);

		}

		$("#reportsTable").empty();
		$("#reportsTable").append(html.join(''));

		// Add sort class to <th>
		var className = "th." + SearchPage.state.sort;
		$(className).addClass('sorted');
		$(className).addClass('sort' + SearchPage.state.dir);

		var sortedHeadContent = $(className).html();
		var ascDesc = (SearchPage.state.dir == "asc") ? "ascending" : "descending";
		$(className).html(sortedHeadContent + '<span class="offScreen">Sorted in ' + ascDesc + ' order</span>');
	},


	drawPagination : function(matches) {
		var firstRow = SearchPage.state.firstRow,
			range = parseInt(SearchPage.state.range),
			html = [],
			pagSet = 8 * range,
			pagStart = 0,
			pagSetCount = 0,
			classes,
			linkText;

		html.push("<div class='pagination hasLayout'><ul><li class='label'>More Results:</li>");

		while (pagStart <= firstRow) {
			pagStart += pagSet;
			pagSetCount++;
		}
		pagSetCount--;

		var i = pagSetCount * pagSet,
			overflow = matches - range,
			limit = 1;

		for (i; i < matches && limit <= 8; i+=range) {
			classes = "";
			if (firstRow == (i+1)) {
				classes = "selected";
			}

			// <<
			if ((i % pagSet === 0) && i !== 0) {
				html.push("<li><a href='javascript:void(0);' id='" + (i+1-range) + "'>&lt;&lt;</a></li>");
			}

			// 1-15
			linkText = (i > overflow)
				? (i+1) + '-' + (i + (matches - i))  //Overflow at end
				: (i+1) + '-' + (i+range);  //Standard
			html.push("<li class='" + classes + "'><a href='javascript:void(0);' id='" + (i+1) + "'>" + linkText + "</a></li>");

			// >>
			if (matches > pagSet && limit == 8 && i < overflow) {
				html.push("<li><a href='javascript:void(0);' id='" + (i+1+range) + "'>&gt;&gt;</a></li>");
			}

			limit++;
		}
		html.push("</ul></div>");
		html.push("<div class='footerAdobeReader disclaimer'>PDF's require <a href=\"javascript:ResultsTable.leaveFidelity('You are about to leave Fidelity.com for a site that is unaffiliated with Fidelity. Fidelity has not been involved in the preparation of the content supplied at the unaffiliated site and does not guarantee or assume any responsibility for its content.','http://www.adobe.com/products/acrobat.html');\">Adobe&reg; Reader&reg;</a> and will open in a new window</div>");

		$("#reportsTable").append(html.join(''));
	},


	scrollTo : function(positionY, positionX) {
		var posX = positionX || 0,
			posY = positionY || 0;
		
		window.scroll(posX, posY);
	},


	drawError : function(error) {
		if (error) {
			//Likely an AJAX error
		} else {
			$("#reportsTable").html("<div class='pagination hasLayout'>No reports were found that matched your criteria.</div>");
		}
	},


	leaveFidelity : function(message, URL) {
		if (confirm(message)) {
			callupWindow = window.open(URL);
		}
	}
};

$(document).ready(function() {
	SearchPage.init();
});
