function ReportSearch() {}

ReportSearch.prototype = {

	init: function(data){

		if(ReportSearch.autoRemoveType) {
			this.initInputInteractions();
		}

		if(typeof tableData == "undefined"){
			return;
		}

		this.initFilter();
		data = data || tableData;

		var container = Element.parseSelector('td.firstCol')[0];
		Element.setHTML(container, data.html);
		this.attachEvents();
		this.renderTable(data.data);

		var startDate, endDate, today;
		today = new Date();
		if(this.data && this.data.search){
			endDate = this.data.search.endDate;
			startDate = this.data.search.startDate;
		}
		else{
			endDate = new Date();
			startDate = new Date(endDate.getFullYear(), endDate.getMonth() - 1, endDate.getDate());
		}

		$('input[name="startDate"]').datepicker({
			inline:false,
			buttonText: 'Choose date',
			buttonImage: '/tdameritrade/images/icons/icn_calendar.gif',
			buttonImageOnly: true,
			showOn:'button',
			duration: '',
			dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
			maxDate: today,
			minDate: new Date(today.getFullYear() - 1, today.getMonth(), today.getDate() ),
			defaultDate: startDate
		})
			.val($.datepicker.formatDate('mm/dd/yy', startDate));

		$('input[name="endDate"]').datepicker({
			inline:false,
			buttonText: 'Choose date',
			buttonImage: '/tdameritrade/images/icons/icn_calendar.gif',
			buttonImageOnly: true,
			showOn:'button',
			duration: '',
			dayNamesMin: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
			maxDate: today,
			minDate: new Date(today.getFullYear() - 1, today.getMonth(), today.getDate() ),
			defaultDate: endDate
		})
			.val($.datepicker.formatDate('mm/dd/yy', endDate));
	},

	initFilter: function(){
		var stockRepSelect = Element.parseSelector('select[name="Stock Reports"]', 'filter')[0];
		var selected = stockRepSelect.options[stockRepSelect.selectedIndex].getAttribute('value');
		var hiddenCheckContainer =
			Element.parseSelector('div.checkBoxes div[assoc!="' + selected + '"], div.checkBoxes br[assoc!="' + selected + '"]',
				Element.getParentBySelector(stockRepSelect, 'div.categoryGroupHeader'));
		var hiddenCheck =
			Element.parseSelector('div.checkBoxes div[assoc!="' + selected + '"] input',
				Element.getParentBySelector(stockRepSelect, 'div.categoryGroupHeader'));
		Element.addClass(hiddenCheckContainer, 'none');
		Element.setAttribute(hiddenCheck, 'disabled', 'disabled');

		var shownCheckContainer =
			Element.parseSelector('div.checkBoxes div[assoc="' + selected + '"], div.checkBoxes br[assoc="' + selected + '"]',
				Element.getParentBySelector(stockRepSelect, 'div.categoryGroupHeader'));
		var shownCheck =
			Element.parseSelector('div.checkBoxes div[assoc="' + selected + '"] input',
				Element.getParentBySelector(stockRepSelect, 'div.categoryGroupHeader'));

		Element.removeClass(shownCheckContainer, 'none');

		for(var i=0; i<shownCheck.length; i++){
			shownCheck[i].removeAttribute('disabled');
		}
	},

	attachEvents: function(){
		var pageLinks = Element.parseSelector("div.tabLinks a");
		Events.add({
			element: pageLinks,
			type: "click",
			handler: this.submit,
			context: this
		});

		var filters = Element.parseSelector('input,select', 'filter');
		filters.push(Element.get('category'));
		Events.add({
			element: filters,
			type: "click",
			handler: this.changeFilter,
			context: this
		});

		Events.add({
			element: Element.get('numDays'),
			type: 'change',
			handler: this.showHideRange,
			context: this
		})

		var selectAlls = Element.parseSelector("a.selectAllLink");
		Events.add({
			element: selectAlls,
			type: "click",
			handler: this.changeFilter,
			context: this
		});
	},

	changeFilter: function(e, el){
		var buttonDivs = Element.parseSelector('div', 'updateButton');
		Element.replaceClass(buttonDivs[0], 'btnOffOuter', 'btnPriorityOnOuter')
		Element.replaceClass(buttonDivs[1], 'btnOffMiddle', 'btnPriorityOnMiddle')
		Element.replaceClass(buttonDivs[2], 'btnOffInner', 'btnPriorityOnInner')
		var parentClass = $(el).parent().attr('class').toString();
		parentClass = parentClass.replace(/^\s\s*/, '').replace(/\s\s*$/, '');
		if (parentClass == 'headerContainer') {
			var container = Element.getParentBySelector(el, 'div.categoryGroupHeader');
			var siblings = Element.parseSelector('input[type="checkbox"]', Element.getParentBySelector(el, 'div.categoryGroupHeader'))
			for (var i = 0; i < siblings.length; i++) {
				siblings[i].checked = el.checked;
			}
		}
		else if(parentClass.match('checkBoxes')){
			var container = Element.getParent(el, 'div');
			var siblings = Element.parseSelector('input[type="checkbox"]', Element.getParentBySelector(el, 'div.categoryGroupHeader'))
			for (var i = 0; i < siblings.length; i++) {
				siblings[i].checked = true;
			}
		}
		//report type select
		else if(parentClass != 'item'){
			var value = el.options[el.selectedIndex].getAttribute('value');
			var yesInputs = [];
			var noInputs = [];
			if(value == "Market"){
				yesInputs = Element.parseSelector('div[group="Market Reports"] input[type="checkbox"]')
				noInputs = Element.parseSelector('div[group="Stock Reports"] input[type="checkbox"]')

			}
			else if(value == "Company"){
				yesInputs = Element.parseSelector('div[group="Stock Reports"] input[type="checkbox"]')
				noInputs = Element.parseSelector('div[group="Market Reports"] input[type="checkbox"]')
			}
			else if(value == "All"){
				yesInputs = Element.parseSelector('div[group="Stock Reports"] input[type="checkbox"],div[group="Market Reports"] input[type="checkbox"]');
			}
			for(var i=0; i<yesInputs.length; i++){
				yesInputs[i].checked = true;
			}

			for(var i=0; i<noInputs.length; i++){
				noInputs[i].checked = false;
			}
		}

		this.initFilter();

	},

	showHideRange: function(e, el){
		var val = el.options[el.selectedIndex].value;
		if(val == "custom"){
			Element.removeClass('dateControls', 'none')
		}
		else{
			Element.addClass('dateControls', 'none')
		}
	},

	popup: function(form, isPublic){

		if(this.searchInput && this.searchInput.value == this.defaultValue) {
			this.searchInput.value = "";
		}

		window.open(
			'',
			'reportSearch',
			(isPublic
				? 'height=800, width=880, resizable=0'
				: 'height=900, width=920, resizable=1, scrollbars=1')
		);

		form.target = 'reportSearch';
		return true;
	},

	renderTable: function(table){
		var noDataMessage = "No results found.";

		if(table.data.length == 0 && Element.get('symbolRadio').checked == true){
			noDataMessage += ' Try a keyword search to get more results.';
		}

		var data = table.data;
		for(var i = 0; i < data.length; i++) {
			data[i].Headline_format = [
				'<div class="iconBackground reportPdfLeft">'
					,'<div><a class="noDecorations" href="', data[i].href,'" onclick="pdf(this.href); return false;">'
						,data[i].Headline
					,'</a></div>'
				,'</div>'
			].join("");
		}

		this.table= new TableCreator_class({
			name: table.name,
			headings: table.headings,
			data: table.data,
			parent:table.name,
			sort:true,
			noDataMessage: noDataMessage
		});
		this.table.draw();
		Element.removeClass(Element.get('resultsContainer'), 'none');
	},

	submit: function(e, el){
		Element.removeClass('reportLoader', 'none');
		(el && el.getAttribute('val'))
			? document.searchForm.firstRow.value = el.getAttribute('val')
			: document.searchForm.firstRow.value = 0;

		var fs = new FormSerializerLite();
		this.data = {};
		this.data.search = fs.getHash(document.searchForm);
		this.data.filter = fs.getHash(document.searchFilter);
		var stockReports = Element.get('stockReports');
		var marketReports = Element.get('marketReports');

		delete(this.data.filter['Stock Reports']);
		delete(this.data.filter['Market Reports']);
		delete(searchResults);


		if(this.data.search.numDays == "Custom"){
			delete(this.data.search.numDays);
			this.data.search.startDate = $('#startDate').val();
			this.data.search.endDate = $('#startDate').val();
		}

		Common.contentBufferAbortRequests();

		Common.loadContentBuffer({
			debug: true,
			page: ("search.asp"),
			context: this,
			preventEval: true,
			contentType: 'text/javascript',
			data: this.data,
			onload: this.updateResults
		});

		if(e == 'fromSubmit'){
			return false;
		}

	},

	updateResults: function(data){

		Element.remove("resultsContainer");
		this.init(DataFunctions.deserialize(data.getResult()));
	},

	initInputInteractions: function() {

		this.searchInput  = input = Element.parseSelector("input[name='searchDisplay']", "right")[0];
		this.defaultValue = text  = input.value;

		var form = Element.getParentBySelector(input, "form");
		var action = form.action;
		var regEx  = /(\&marketsOnly\=true)/i;
		var match;

		/**
		 *  This is set up this way so that if
		 * any other special behavior is needed, it can be easily
		 * added to the regEx and switch statments.
		 */
		if((match = regEx.exec(action)) != null) {

			switch(match[0]) {
				case '&marketsOnly=true':
					this.applyMarketToggleEvents(form, match[0]);
					break;
				default:
					break;
			}
		}


		Events.add({
			 element: window
			,type:'focus'
			,handler: function() {
				if(!input.value) {
					input.value = text;
				}
			}
		});

		Events.add({
			 element: input
			,type: 'blur'
			,handler: function(e, el) {
				if(!el.value || el.value.match(/^\s?$/)) {
					el.value = text;
				}
				if(el.value == text) {
					Element.setStyle(el, "color:#999");
				}
			}
			,context: this
		})

		Events.add({
			 element: input
			,type: 'focus'
			,handler: function(e, el) {
				if(el.value == text) {
					el.value = '';
				}
				Element.setStyle(el, "color:#000");
			}
			,context: this
		});
		Element.setStyle(input, "color:#999");
	},

	applyMarketToggleEvents: function(form, match) {

		//We are going to get each radio button
		//and toggle the marketonly flag bc if you
		//are searching by symbol, marketonly is worthless
		//and returns no results

		var reg = new RegExp(match, 'i');
		var radioEls = Element.parseSelector("input[type='radio']", form);
		var radios = {};

		for(var i = 0; i < radioEls.length; i++) {
			radios[radioEls[i].value] = radioEls[i];
		}

		//Apply an event that takes the marketsOnly flag off
		//of the form action if symbol is clicked

		if(radios.symbol) {
			Events.add({
				 element: radios.symbol
				,type:'click'
				,handler:function() {
					if(reg.test(form.action)){
						form.action = form.action.replace(reg, '');
					}
				}
			});
		}

		//Apply an event that adds back the marketsOnly flag if
		//the flag was removed.

		if(radios.keyword) {
			Events.add({
				 element: radios.keyword
				,type:'click'
				,handler:function() {
					if(!reg.test(form.action)){
						form.action = form.action+match;
					}
				}
			});
		}
	}
}

loadBuffer.add(function() {
	window.reportSearch = new ReportSearch();
	reportSearch.init();
});
