//********************************CONSTANTS*********************************
var REPORT_TYPE_IPR = "ipr";
var REPORT_TYPE_CYC = "cyc";
//***************************************************************************
// Switch Div (moved from global.js) ************************
function switch_div(visible, hidden) {
	document.getElementById(visible).style.display = 'block';
	document.getElementById(hidden).style.display = 'none';
}
//**********************************************************
function show_price_change_input(reportNumber, totalPlotReports) {
	clearAllErrorMessages(totalPlotReports);
	hideAllPriceChangeDivs(totalPlotReports);
	displayRequestedPriceChangeDiv(reportNumber);
}
function displayRequestedPriceChangeDiv(reportNumber) {
	document.getElementById('price_description_' + reportNumber).style.display = 'none';
	document.getElementById('price_change_' + reportNumber).style.display = 'block';
}
function hideAllPriceChangeDivs(totalPlotReports) {
	for (var i = 1; i <= totalPlotReports; i++) {
		document.getElementById('price_description_' + i).style.display = 'block';
		document.getElementById('price_change_' + i).style.display = 'none';
	}
}
function submitForm(action, formId) {
	document.getElementById(formId).action = action;
	document.getElementById(formId).submit();
}
function searchProducts(action, formId) {
	searching();
	submitForm(action, formId);
}
function searchPlotResults(action, maxAllowableIPRs, errorDivId) {
	clearReportSelectionErrorMessages();
	if (validateNumberOfPlotsSelected(maxAllowableIPRs, errorDivId)) {
		searching();
		submitForm(action, 'accordion_form');
	}
}
function clearReportSelectionErrorMessages() {
	document.getElementById('error_top').innerHTML = "";
	document.getElementById('error_bottom').innerHTML = "";
}
function validateNumberOfPlotsSelected(maxAllowableIPRs, errorDivId) {
	var counter = getSelectedPlots(document.getElementById('accordion_form').plotId);
	if (counter == 0) {
		document.getElementById(errorDivId).innerHTML = "Please select at least 1 yield harvest trial location.";
		return false;
	}
	if (counter > maxAllowableIPRs) {
		document.getElementById(errorDivId).innerHTML = "Please select only " + maxAllowableIPRs + " yield harvest trial locations at a time.";
		return false;
	}
	return true;
}
function getSelectedPlots(checkBoxFieldName) {
	var counter = 0;
	if (isCheckboxAList(checkBoxFieldName)) {
		for (var i = 0; i < checkBoxFieldName.length; i++) {
			if (checkBoxFieldName[i].checked) {
				counter++;
			}
		}
	}
	else if (checkBoxFieldName.checked) {
		counter++;
	}
	return counter;
}
function isCheckboxAList(plotIdFormElement) {
	return plotIdFormElement.length;
}
function changeCalculation(sellingPriceField, moistureDeductionField, yieldPercentMoisture, reportNumber,
													 totalPlotReports) {
	if (validateFields(sellingPriceField, moistureDeductionField, reportNumber)) {
		clearAllErrorMessages(totalPlotReports);
		updateGrossIncome(sellingPriceField.value, moistureDeductionField.value, yieldPercentMoisture, totalPlotReports);
		hideAllPriceChangeDivs(totalPlotReports);
		updateAllInputFields(sellingPriceField.value, moistureDeductionField.value, totalPlotReports);
		updateAllPriceDesc(sellingPriceField.value, moistureDeductionField.value, totalPlotReports);
	}
	return false;
}
function updateAllInputFields(sellingPrice, moistureDeduction, totalPlotReports) {
	for (var i = 1; i <= totalPlotReports; i++) {
		try {
			document.getElementById('updatedSellingPricePerUnitText_' + i).value = parseFloat(sellingPrice).toFixed(2);
			document.getElementById('updatedMoistureDeductionText_' + i).value = parseFloat(moistureDeduction).toFixed(2);
		} catch(ex) {
			//Ignore Error: Since all reports might not have data (they'll just have a no result message)
		}
	}
}
function updateAllPriceDesc(sellingPrice, moistureDeduction, totalReports) {
	for (var i = 1; i <= totalReports; i++) {
		try {
			document.getElementById('selling_price_used_for_calculation_' + i).innerHTML = parseFloat(sellingPrice).toFixed(2);
			document.getElementById('moisture_deduction_used_for_calculation_' + i).innerHTML = parseFloat(moistureDeduction).toFixed(2);
		} catch(ex) {
			//Ignore Error: Since all reports might not have data (they'll just have a no result message)
		}
	}
}
function validateFields(sellingPriceField, moistureDeductionField, reportNumber) {
	if (!validateRequired(sellingPriceField, 'Selling price per unit is required.', reportNumber)) {
		return false;
	}
	if (!validateIsNumeric(sellingPriceField, 'Selling price per unit is not a valid number.', reportNumber)) {
		return false;
	}
	if (!validateRequired(moistureDeductionField, 'Moisture deduction is required.', reportNumber)) {
		return false;
	}
	if (!validateIsNumeric(moistureDeductionField, 'Moisture deduction is not a valid number.', reportNumber)) {
		return false;
	}
	return true;
}
function validateRequired(field, message, reportNumber) {
	if (field.value == null || trim(field.value) == '') {
		performFailureAction(field, message, reportNumber);
		return false;
	} else {
		return true;
	}
}
function validateIsNumeric(field, message, reportNumber) {
	var valid = true;
	var validValues = "0123456789" + '.';
	var fieldValue = trim(field.value);
	for (var i = 0; i < fieldValue.length; i++) {
		var ch = fieldValue.charAt(i);
		if (!containsChar(validValues, ch)) {
			valid = false;
			break;
		}
	}
	if (calculateOccurance(fieldValue, '.') > 1) {
		valid = false;
	}
	if (!valid) {
		performFailureAction(field, message, reportNumber);
		return false;
	} else {
		return true;
	}
}
function performFailureAction(field, message, reportNumber) {
	displayErrorMessage(message, 'block', reportNumber);
	field.select();
	field.focus();
}
function displayErrorMessage(message, displayType, reportNumber) {
	document.getElementById('change_calculation_error_' + reportNumber).innerHTML = message;
	document.getElementById('change_calculation_error_' + reportNumber).style.display = 'block';
}
function clearAllErrorMessages(totalPlotReports) {
	for (var i = 1; i <= totalPlotReports; i++) {
		try {
			document.getElementById('change_calculation_error_' + i).innerHTML = '';
			document.getElementById('change_calculation_error_' + i).style.display = 'none';
		} catch(ex) {
			//Ignore Error: Since all reports might not have data (they'll just have a no result message)
		}
	}
}
function calculateOccurance(str, ch) {
	var count = 0;
	for (var i = 0; i < str.length; i++) {
		if (str.charAt(i) == ch) {
			count++;
		}
	}
	return count;
}
function containsChar(str, ch) {
	for (var i = 0; i < str.length; i++) {
		if (str.charAt(i) == ch) {
			return true;
		}
	}
	return false;
}
function updateGrossIncome(sppu, md, ypm, totalPlotReports) {
	for (var i = 1; i <= totalPlotReports; i++) {
		var grossIncomeTotal = 0;
		var totalPlotEntries = document.getElementById('total_plot_entries_' + i).value;
		for (var j = 1; j <= totalPlotEntries; j++) {
			var entry_yield = trim(document.getElementById('entry_yield_' + i + '_' + j).innerHTML);
			var entry_hm = trim(document.getElementById('entry_harvest_moisture_' + i + '_' + j).innerHTML);
			var entry_gross = calculateEntryGrossIncome(sppu, md, ypm, entry_yield, entry_hm);
			document.getElementById('entry_gross_income_' + i + '_' + j).innerHTML = entry_gross.toFixed(2);
			grossIncomeTotal += entry_gross;
		}
		if (totalPlotEntries > 0 && grossIncomeTotal > 0) {
			var averageGrossIncome = grossIncomeTotal / totalPlotEntries;
			document.getElementById('average_gross_income_' + i).innerHTML = averageGrossIncome.toFixed(2);
		}
	}
}
function getIdAttribute(node) {
	//Note: IE throws an exception if no "id" attribute is found, while Firefor returns null. Thus a double check is needed
	try {
		var id = node.getAttribute('id');
		if (id != null) {
			return id;
		}
	}
	catch(err) {
		//Ignore error thrown, since some child nodes might not be an element with an 'id' attribute.
	}
	return '';
}
function calculateEntryGrossIncome(sellingPricePerUnit, moistureDeduction, yieldPercentMoisture, entryYield,
																	 entryHarvestMoisture) {
	return totalSellingPrice(entryYield, sellingPricePerUnit) -
				 costOfDrying(entryHarvestMoisture, yieldPercentMoisture, moistureDeduction, entryYield);
}
function totalSellingPrice(entryYield, sellingPricePerUnit) {
	return entryYield * sellingPricePerUnit;
}
function costOfDrying(entryHarvestMoisture, yieldPercentMoisture, moistureDeduction, entryYield) {
	var harvestMoistureAboveBase = entryHarvestMoisture - yieldPercentMoisture;
	if (harvestMoistureAboveBase > 0) {
		return harvestMoistureAboveBase * moistureDeduction * entryYield;
	}
	return 0;
}
function showSelectedReport(selectedReportNameIndex, totalCooperatorReports) {
	if (selectedReportNameIndex == null) {
		selectedReportNameIndex = 1;
	}
	for (var reportIndex = 1; reportIndex <= totalCooperatorReports; reportIndex++) {
		if (reportIndex == selectedReportNameIndex) {
			disableLinkAndShowContent(reportIndex);
		} else {
			enableLinkAndHideContent(reportIndex);
		}
	}
	if(totalCooperatorReports > 1){		
		enableShowAllLink();
	}
}
function showAllReports(totalPlotReports) {
	for (var reportIndex = 1; reportIndex <= totalPlotReports; reportIndex++) {
		enableLinkAndShowContent(reportIndex);
	}
	disableShowAllLink();
}
function disableShowAllLink() {
	document.getElementById("show_all_report_link").style.display = 'none';
	document.getElementById("show_all_report_text").style.display = 'inline';
}
function enableLinkAndShowContent(reportIndex) {
	document.getElementById("report_name_link_" + reportIndex).style.display = 'inline';
	document.getElementById("report_name_text_" + reportIndex).style.display = 'none';
	document.getElementById("report_wrapper_" + reportIndex).style.display = 'block';
}
function enableLinkAndHideContent(reportIndex) {
	document.getElementById("report_name_link_" + reportIndex).style.display = 'inline';
	document.getElementById("report_name_text_" + reportIndex).style.display = 'none';
	document.getElementById("report_wrapper_" + reportIndex).style.display = 'none';
}
function disableLinkAndShowContent(reportIndex) {
	document.getElementById("report_name_link_" + reportIndex).style.display = 'none';
	document.getElementById("report_name_text_" + reportIndex).style.display = 'inline';
	document.getElementById("report_wrapper_" + reportIndex).style.display = 'block';
}
function enableShowAllLink() {
	document.getElementById("show_all_report_link").style.display = 'inline';
	document.getElementById("show_all_report_text").style.display = 'none';
}
function numericOnlyKeypress(myfield, e, action, formId) {
	var unicode = e.charCode ? e.charCode : e.keyCode;
	if (unicode > 26) { // don't mess with control chars
		if (unicode < 48 || unicode > 57) { //if not a number
			return false;
			//disable key press
		}
	}
	return submitWhenUserPressesEnter(myfield, e, action, formId);
}
function submitWhenUserPressesEnter(myfield, e, action, formId) {
	var keycode;
	if (window.event) {
		keycode = window.event.keyCode;
	}
	else if (e) keycode = e.which;
	else return true;
	if (keycode == 13) {
		searching();
		submitForm(action, formId);
		return false;
	}
	return true;
}
function trim(str) {
	while (str.substring(0, 1) == ' ')
	{
		str = str.substring(1, str.length);
	}
	while (str.substring(str.length - 1, str.length) == ' ')
	{
		str = str.substring(0, str.length - 1);
	}
	return str;
}
function switch_accordion_div(content_id, link_id, table_container_id, proximityOnClickedLink, totalProximalCounties) {
	resetAccordionForm();
	if (isCountyOpen(link_id)) {
		//An open county is clicked, just close it and exit...
		closeCounty(content_id, link_id, table_container_id);
		return;
	}
	for (var i = 1; i <= totalProximalCounties; i++) {
		closeCounty('county_content-' + i, 'county_link-' + i, 'table_container-' + i);
	}
	setSelectedProximity(proximityOnClickedLink);
	openCounty(content_id, link_id);
}
function isCountyOpen(link_id) {
	return document.getElementById(link_id).className == 'expanded';
}
function closeCounty(content_id, link_id, table_container_id) {
	document.getElementById(content_id).style.display = 'none';
	document.getElementById(link_id).className = 'row_label';
	document.getElementById(table_container_id).scrollTop = 0;
}
function openCounty(content_id, link_id) {
	document.getElementById(link_id).className = 'expanded';
	document.getElementById(content_id).style.display = 'block';
}
function delay(msec) {
	var date = new Date();
	var curDate = null;
	do {
		curDate = new Date();
	}
	while (curDate - date < msec);
}
function resetAccordionForm() {
	document.getElementById('accordion_form').reset();
}
function setSelectedProximity(proximityOnClickedLink) {
	document.getElementById('selectedProximity').value = proximityOnClickedLink;
}
//***************************Search Product Form - Common Scripts************************
function switch_form_subparts(reportSelectionFormId, iprProductSearchFormId, cycProductSearchFormId, ajaxControllerURL) {
	var iprForm = document.getElementById(iprProductSearchFormId);
	var cycForm = document.getElementById(cycProductSearchFormId);
	var iprCropOptions = iprForm.crop.options;
	var cycCropOptions = cycForm.cyc_crop.options;
	var selectedReportType = document.getElementById(reportSelectionFormId).report.value;
	if (selectedReportType == REPORT_TYPE_IPR) {
		set_visible_class('ipr_form_subparts');
		set_hidden_class('cyc_form_subparts');
		iprForm.zip_code_input.value = cycForm.cyc_zip_code_input.value;
		selectOption(cycCropOptions[cycCropOptions.selectedIndex].text, iprCropOptions);
	}
	if (selectedReportType == REPORT_TYPE_CYC) {
		set_visible_class('cyc_form_subparts');
		set_hidden_class('ipr_form_subparts');
		cycForm.cyc_zip_code_input.value = iprForm.zip_code_input.value;
		selectOption(iprCropOptions[iprCropOptions.selectedIndex].text, cycCropOptions);
		populateYearsAndRadiusListUsingAJAX(cycProductSearchFormId, ajaxControllerURL, selectedReportType);
	}
}
function selectOption(textToSelect, dropdownOptions){
	for(var i = 0; i < dropdownOptions.length; i++) {
		var dropdownText = dropdownOptions[i].text;
		if(dropdownText == textToSelect){
			dropdownOptions.selectedIndex = i;
			break;
		}
	}
}
function set_visible_class(div_id) {
	document.getElementById(div_id).className = 'visible_subparts';
}
function set_hidden_class(div_id) {
	document.getElementById(div_id).className = 'hidden_subparts';
}
function filterCYCProducts(action, formId) {
	if (!isRMRangeValid(formId)) {
		addCYCError();
		return;
	}
	submitForm(action, formId);
}
function isRMRangeValid(formId) {
	var rmStart = document.getElementById(formId).rm_low.value;
	var rmEnd = document.getElementById(formId).rm_high.value;
	return parseFloat(rmStart) <= parseFloat(rmEnd);
}
function addCYCError() {
	document.getElementById('cycErrors').style.color = '#f00';
	document.getElementById('cycErrors').innerHTML = 'Please select an appropriate range for filtering products by Relative Maturity.';
}
//********************************** CYC - Report ****************************************************
function show_cyc_report_div(div_id, totalDivs) {
	// hide all the divs
	for (var i = 1; i <= totalDivs; i++) {
		document.getElementById('tab-' + i).style.display = 'none';
	}
	// show the requested div
	document.getElementById(div_id).style.display = 'block';
}
function viewCYCReports(action, maxAllowableProducts, errorDivId) {
	clearReportSelectionErrorMessages();
	if (validateNumberOfCYCProductsSelected(maxAllowableProducts, errorDivId)) {
		searching();
		submitForm(action, 'cycProductListForm');
	}
}
function validateNumberOfCYCProductsSelected(maxAllowableProducts, errorDivId) {
	var counter = getSelectedPlots(document.getElementById('cycProductListForm').product);
	if (counter == 0) {
		document.getElementById(errorDivId).innerHTML = "Please select at least 1 product.";
		return false;
	}
	if (counter > maxAllowableProducts) {
		document.getElementById(errorDivId).innerHTML = "Please select only " + maxAllowableProducts + " products at a time.";
		return false;
	}
	return true;
}
function update_cyc_gross_income(ypm, reportIndex, totalReports) {
	var sppu_field = document.getElementById('updatedSellingPricePerUnitText_' + reportIndex);
	var md_field = document.getElementById('updatedMoistureDeductionText_' + reportIndex);
	if (validateFields(sppu_field, md_field, reportIndex)) {
		closeAllGrossIncomeForms(totalReports);
		clearAllErrorMessages(totalReports);
		updateCYCGrossIncome(sppu_field.value, md_field.value, ypm, totalReports);
		updateAllInputFields(sppu_field.value, md_field.value, totalReports);
		updateAllPriceDesc(sppu_field.value, md_field.value, totalReports);
	}
	return false;
}
function open_cyc_update_gross_income_form(reportIndex, totalReports) {
	closeAllGrossIncomeForms(totalReports);
	clearAllErrorMessages(totalReports);
	document.getElementById('price_change-' + reportIndex).style.display = 'block';
	document.getElementById('price_description-' + reportIndex).style.display = 'none';
}
function closeAllGrossIncomeForms(totalReports) {
	for (var i = 1; i <= totalReports; i++) {
		try {
			document.getElementById('price_change-' + i).style.display = 'none';
			document.getElementById('price_description-' + i).style.display = 'block';
		} catch(ex) {
			//Ignore Error: Since all reports might not have data (they'll just have a no result message)
		}
	}
}
function updateCYCGrossIncome(sppu, md, ypm, totalReports) {
	for (var i = 1; i <= totalReports; i++) {
		try {
			var totalCheckProducts = document.getElementById('check_products_count_' + i).value;
			for (var j = 1; j <= totalCheckProducts; j++) {
				var head_yield = trim(document.getElementById('head_yield_' + i + '_' + j).innerHTML);
				var head_hm = trim(document.getElementById('head_hm_' + i + '_' + j).innerHTML);
				var head_gross = calculateEntryGrossIncome(sppu, md, ypm, head_yield, head_hm).toFixed(2);
				var check_yield = trim(document.getElementById('check_yield_' + i + '_' + j).innerHTML);
				var check_hm = trim(document.getElementById('check_hm_' + i + '_' + j).innerHTML);
				var check_gross = calculateEntryGrossIncome(sppu, md, ypm, check_yield, check_hm).toFixed(2);
				var adv_gross = (head_gross - check_gross).toFixed(2);
				document.getElementById('head_gross_' + i + '_' + j).innerHTML = '$' + head_gross;
				document.getElementById('check_gross_' + i + '_' + j).innerHTML = '$' + check_gross;
				document.getElementById('adv_gross_' + i + '_' + j).innerHTML = '$' + adv_gross;
			}
		} catch(ex) {
			//Ignore Error: Since all reports might not have data (they'll just have a no result message)
		}
	}
}
//******************************** Ajax ****************************************************
function populateYearsAndRadiusListUsingAJAX(formId, ajaxControllerURL, reportType) {
	if(reportType != REPORT_TYPE_CYC){
		return;
	}
	var cycForm = document.getElementById(formId);
	var yearOptions = cycForm.cyc_year.options;
	var radiusOptions = cycForm.radius.options;
	emptyDropDown(yearOptions);
	emptyDropDown(radiusOptions);
	var crop = cycForm.cyc_crop.value;	
	if (crop == '') {
		loadEmptyYearOption(yearOptions);
		loadEmptyYearOption(radiusOptions);
		return;
	}
	try {
		var pos = new POSConnection("AsgrowAndDekalb_CropCriteriaPOS");
		pos.setControllerURL(ajaxControllerURL);
		var request = buildRequestDocument(crop, 'Yield Summary');
		var resultDoc = pos.send(request);
		if (isErrors(resultDoc)) {
			loadDefaultYearOption(yearOptions, 0);
			loadDefaultRadiusOption(radiusOptions);
			return;
		}
		populateYearDropdown(resultDoc, yearOptions);
		populateRadiusDropDown(resultDoc, radiusOptions);
	} catch(ex) {
		loadDefaultYearOption(yearOptions, 0);
		loadDefaultRadiusOption(radiusOptions);
	}
}
function populateYearDropdown(resultDoc, yearOptions) {
	var yearNodeList = getNodeList('year', resultDoc);
	var yearValue;
	var optionsIndex = 0;
	for (var i = 0; i < yearNodeList.length; i++) {
		if (yearNodeList[i].childNodes && yearNodeList[i].childNodes[0]) {
			yearValue = yearNodeList[i].childNodes[0].nodeValue;
			yearOptions[optionsIndex] = getNewOption(yearValue, yearValue);
			optionsIndex++;
		}
	}
	loadDefaultYearOption(yearOptions, yearOptions.length);
}
function populateRadiusDropDown(resultDoc, radiusOptions) {
	var radiusNodeList = getNodeList('radius', resultDoc);
	if (radiusNodeList.length > 0) {
		var radiusValue;
		var optionsIndex = 0;
		for (var i = 0; i < radiusNodeList.length; i++) {
			if (radiusNodeList[i].childNodes && radiusNodeList[i].childNodes[0]) {
				radiusValue = radiusNodeList[i].childNodes[0].nodeValue;
				if (radiusValue == '200') {
					radiusOptions[optionsIndex] = getNewOption(radiusValue + ' mi', radiusValue);
					radiusOptions.selectedIndex = optionsIndex;
				} else {
					radiusOptions[optionsIndex] = getNewOption(radiusValue + ' mi', radiusValue);
				}
				optionsIndex++;
			}
		}
	} else {
		loadDefaultRadiusOption(radiusOptions);
	}
}
function getNodeList(nodeName, resultDoc) {
	return resultDoc.getElementsByTagName(nodeName);
}
function emptyDropDown(dropdownOptions) {
	while (dropdownOptions.length) {
		dropdownOptions[0] = null;
	}
}
function loadDefaultYearOption(yearOptions, index) {
	yearOptions[index] = getNewOption('All Years', 'all');
	yearOptions.selectedIndex = index;
}
function loadEmptyYearOption(yearOptions) {
	yearOptions[0] = getNewOption('-', '');
}
function loadDefaultRadiusOption(radiusOptions) {
	radiusOptions[0] = getNewOption('200 mi', '200');
	radiusOptions.selectedIndex = 0;
}
function loadEmptyRadiusOption(radiusOptions) {
	radiusOptions[0] = getNewOption('-', '');
}
function getNewOption(text, value) {
	var option = new Option();
	option.text = text;
	option.value = value;
	return option;
}
function buildRequestDocument(crop, reportType) {
	return '<CropPOSRequest><cropSRGId>' + crop + '</cropSRGId><reportType>' + reportType + '</reportType></CropPOSRequest>';
}
function isErrors(xmlDoc) {
	try {
		var error = xmlDoc.selectNodes("/ERROR/ERROR_MESSAGE");
		return error.length > 0;
	} catch(ex) {
		return false;
		//Ignore...Firefox throws exception
	}
}
//************************************ SRG - Find-A-Seed *********************************************
function findASeed() {
	searching();
	document.getElementById('productId_footer').value = document.getElementById('findASeedProductId').value;
	document.getElementById('FindASeed_footer').submit();
}
function searching() {
	document.getElementById('searching').style.display = 'block';
}
function findASeedKeypress(e) {
	var keynum = 0
	var keychar
	var numcheck
	if (window.event) {	// IE
		keynum = e.keyCode
	} else if (e.which) {	// Netscape/Firefox/Opera
		keynum = e.which
	}
	if (keynum == 13) {
		findASeed();
		return false;
	} else {
		return true;
	}
}
//**************************************************************************************************