package kz.istt.locust;

import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Settings.Secure;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.Toast;

import androidx.core.app.ActivityCompat;
import androidx.core.content.FileProvider;
import androidx.fragment.app.FragmentActivity;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.UUID;
import java.util.zip.CRC32;

import dbfields.AutoCompleteTextViewDB;
import dbfields.StringDB;
import dbfields.fieldDB;
import dbfields.selectDB;
import tools.LatLonListener;
import tools.OnClickListenerDateTime;
import tools.OnClickListenerImage;
import tools.OnClickListenerImageShow;

public class LocustHealthActivity extends FragmentActivity implements LocationListener, LatLonListener
{
	private LocationManager _lm;
	private ScrollView scrollView1						= null;

	private double			_lat							= 0;					// c GPS приёмника
	private double			_lon							= 0;					// c GPS приёмника

	public String frmlocustdel_uid					= null;				// Unique identifier of the record
	public String frmlocusthealth_uid				= null;				// Unique identifier of the record

	public Integer del								= null;
	public Long seq									= null;				// Дата Изменения записи секунд с 1970 года
	public StringDB m_Filled						= new StringDB("1");	// 1- все обяз. поля заполнены, 0 - не все обяз. поля заполнены
	// public Long created = null; // Дата создания записи секунд с 1970 года
	//public Integer			user_id							= null;

	//public String ImageName							= null;				// Название файла рисунка
	//public String tmp_ImageName						= null;				// Временное название файла

	//public EditText edtImage1						= null;				// Фото
	//public EditText edtImage2						= null;				// Фото
	//public EditText edtImage3						= null;				// Фото
	public View spiCountry							= null;				// страна
	public View spiRegion							= null;				// Область
	public EditText edtArea							= null;				// Район
	public EditText edtDistrict						= null;				// Сельский округ
	public EditText edtVillage						= null;				// Посёлка
	public EditText edtTerrain						= null;				// Название местности либо урочища
	
	public EditText edtObserver						= null;

	public EditText edtDate							= null; // Дата (передаётся в секундах с 1970 года)
	public EditText edtTimeZone 					= null;

	public EditText edtLatCenter					= null;				// Широта
	public EditText edtLonCenter					= null;				// Долгота
	public ListView latlonList						= null;

	//Идентификация места мониторинга
	public EditText edtObserverHealth				= null;				//H Имя руководителя бригады по мониторингу ЗЧ и ОС
	public EditText edtMonitoringDate				= null;				//H Дата мониторинга
	public EditText edtMonitoringTimeZone			= null;				//H Временная зона для: Дата мониторинга
	public EditText edtLatCenter2					= null;				// Широта
	public EditText edtLonCenter2					= null;				// Долгота

	public View spiFrmLocustDelFilled				= null;				//H Заполнялась ли Форма по Мониторингу противосаранчовых обработок бригадой по обработке?

	//Бригада по обработке
	public EditText edtBrigadeCount					= null;				//H Количество работников в бригаде по обработке
	public EditText edtBrigadeCountTrained			= null;				//H Количество работников, ранее обученных обращению с инсектицидами и их применению


	public EditText edtInfestedArea					= null;				// заселенная площадь(га)
	public EditText edtTreatedArea					= null;				// обработанная площадь(га)
	public EditText edtTreatedAreaCheck				= null;				//H Обработанная площадь (проверено бригадой по мониторингу) (га)
	public View spiVegType							= null;				// Тип(дикая, культурная)
	public EditText edtVegHeight					= null;				// Высота (м)
	public View spiVegCover							= null;				// Растительный покров (Редкий, Ср., Густой)
	public EditText edtVegCrop						= null;				// Перечисление культур
	//public View spiVegDamage						= null;				// Повреждения растительного покрова(%)
	//public EditText edtVegDamageArea				= null;				// Площадь повреждений (га)

	//Информация об инсектицидах
	public EditText edtInsName						= null;				// коммерческое название
	public EditText edtInsPartNumber				= null;				//H Номер партии препарата (если указан на контейнере)
	public EditText edtInsManufacturedDate			= null;				//H Дата производства или Срок годности (срок хранения)

	public EditText edtInsActiveSubstance			= null;				// Наименование активного вещества отравы
	public EditText edtInsConcentration				= null;				// концентрация(г д.в./л или%)
	public View spiInsFormulation					= null;				// формуляция(УМО, КЭ, др.)
	public EditText edtInsDose						= null;				// норма расхода(л/га)
	public View spiInsDiluted						= null;				// Коммерческий припарат разбавлен?
	public EditText edtInsProportion				= null;				// пропорция разбавления рабочей жидкости
	public EditText edtInsRate						= null;				// расход рабочей жидкости(л/га)
	public View spiInsContainerState				= null;				//H Состояние пакетов или контейнеров с инсектицидами

	public EditText edtInsUsedVolume				= null;				// Общий объем использованной рабочей жидкости (л)
	public EditText edtSprFactVolume				= null;				//H Фактическая норма объема опрыскивания (л/га)
	public View spiSprObservation					= null;				//H Если проводилось наблюдение за опрыскиванием: соблюдалась ли надлежащая практика применения инсектицидов?
	public EditText edtSprDescription				= null;				//H Замечания относительно наблюдаемой практики опрыскивания

	public View spiCalibrConsumptionCheck			= null;				//H Калибровка расхода жидкости: проверялся ли расход жидкости опрыскивателя во время мониторинга?
	public EditText edtCalibrTime					= null;				//H Время калибровки (мин.):
	public EditText edtCalibrVolume					= null;				//H Собранный объем (л):
	public EditText edtCalibrRate					= null;				//H Расход жидкости (л/мин):
	public View spiCalibrPrecipitation				= null;				//H Качество применения: проверялось ли осаждение капель во время мониторинга?
	public EditText edtCalibrWidthCard				= null;				//H Длина трансекты, определенная с использованием масляно-/водочувствительной бумаги (м)
	public EditText edtCalibrWindSpeed				= null;				//H Средняя скорость ветра при осаждении капель (м/с)
	public EditText edtCalibrDropletCoating			= null;				//H Ширина дорожки с хорошим покрытием капель (м)
	public EditText edtCalibrPassesInterval			= null;				//H Рекомендуемый интервал между проходами (м)

	public View spiEffControl						= null;				// Контроль эфективности (Контроль эффективности проведен (бригада по обработке)?)
	//public View spiEffTypeImpact					= null;				// Тип оцениваемого биологического воздействия (теперь множественный выбор, не используется)
	public GridLayout glBiologicalImpact			= null;				// Тип оцениваемого биологического воздействия (grid)
	public EditText edtBiologicalImpact				= null;				// Тип оцениваемого биологического воздействия (список значений)

	public EditText edtEffMortality					= null;				// смертность саранчи(%)
	public EditText edtEffPassedTime				= null;				// Прошло времени после обработки в часах
	public View spiEffMethod						= null;				// метод подсчета смертности

	public View spiEffControl2						= null;				//H Проведен ли контроль эффективности (бригада мониторинга)?
	//public View spiEffTypeImpact2					= null;				//H Тип оцениваемого биологического воздействия
	public GridLayout glEffTypeImpact				= null;				//H Тип оцениваемого биологического воздействия(grid)
	public EditText edtEffTypeImpact				= null;				//H Тип оцениваемого биологического воздействия (список значений)

	public EditText edtEffMortality2				= null;				//H Наблюдаемая эффективность обработки (%)
	public EditText edtEffPassedTime2						= null;				//H Прошло времени после обработки
	public View spiEffMethod2						= null;				//H Метод оценки эффективности обработки (выбор: подсчет квадратов; подсчет по разрезам; подсчет кулиг личинок; другое)

	//public EditText edtInsUsedVolume				= null;				// Общий объем использованной рабочей жидкости (л)
	// public DateInput edtInsExpiryDate = null; // окончание срока действия (дата)
	// public SpinnerDB spiInsMixed = null; // смешивается ли инсектицид с водой или растворителем?
	// public EditText edtInsMixedName = null; // Если да то с каким
	// public EditText edtInsMixedRatio = null; // если да, то в каком соотношении (%)
	public View spiWeaTimeStart						= null;				// время начала
	public View spiWeaTimeEnd						= null;				// время окончания
	public EditText edtWeaTemperatureStart			= null;				// Температура нач.(°C)
	public EditText edtWeaTemperatureEnd			= null;				// Температура кон.(°C)
	//public EditText edtWeaWindSpeedStart			= null;				// скорость ветра нач. (м/с)
	//public EditText edtWeaWindSpeedEnd				= null;				// скорость ветра кон. (м/с)

	public View spiWindDirectionStart				= null;				// направление ветра нач.
	public View spiWindDirectionEnd					= null;				// направление ветра кон.
	public View spiSprayDirectionStart				= null;				// направление опрыскивания нач.
	public View spiSprayDirectionEnd				= null;				// направление опрыскивания кон.

	public View spiLocSpecies						= null;				// вид: CIT, DMA, LMI, др.
	public View spiLocHoppers						= null;				// Стадии личинок, возраста: Младшие Средние Старшие
	public EditText edtLocDensity					= null;				// плотность на м2
	public View spiMainPurpose						= null;				// Основная цель при обработке (Имаго,Кулиги,Стаи,Разреженные)


	//public View spiLocustPhaseId					= null;				// Фара саранчи
	public View spiSprPlatform						= null;				// Вид опрыскивания

	public View spiSprPlatformA						= null;				// «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан».
	public View spiSprPlatformG						= null;				// «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG».
	public View spiSprPlatformH						= null;				// «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный».

	// public SpinnerDB spiSprOperator				= null;				// Оператор (пилот, водитель, др...)
	// public EditText edtSprOperatorName = null; // �?мя оператора
	public EditText edtSprManufacturer				= null;				// Марка опрыскивателя
	//public EditText edtSprModel						= null;				// Модель опрыскивателя
	// public DateInput edtDateCalibration = null; // Дата последней калибровки
	public EditText edtSprHeight					= null;				// Высота над поверхностью почвы (м)
	public View spiSprLeak							= null;				//H Механическая безопасность: наблюдалась ли утечка инсектицида?
	public EditText edtSprLeakPlace					= null;				//H Если Да, в какой части опрыскивателя имеется утечка?
	public View spiSprDamage						= null;				//H Система опрыскивания: повреждены распылители или сопла?
	public EditText edtSprDamagePlace				= null;				//H Если Да, какие повреждения?

	// public EditText edtSprWidth = null; // Ширина захвата (м)
	// public EditText edtSprSpacing = null; // Расстояние между проходами опрыскивателя (м) (Надия Рашидовна сказала удалить)
	public View spiSprBarrier						= null;				// Барьеры (да, нет)
	//public EditText edtSprBarrierWidth				= null;				// ширина (м)
	public EditText edtSprBarrierSpace				= null;				// промежуток (м)
	public EditText edtSprSpeed						= null;				// Скорость движения (км/ч)
	public View spiSprMarking						= null;				// Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет)


	public CheckBox cbSafClothingGoggles			= null;				// Какой защитной одеждой пользовался оператор: Очки
	public CheckBox cbSafClothingMasks				= null;				// Какой защитной одеждой пользовался оператор: Маска
	public CheckBox cbSafClothingGloves				= null;				// Какой защитной одеждой пользовался оператор: Перчатки
	public CheckBox cbSafClothingOveralls			= null;				// Какой защитной одеждой пользовался оператор: Комбинезон
	public CheckBox cbSafClothingCaps				= null;				// Какой защитной одеждой пользовался оператор: Кепка
	public CheckBox cbSafClothingBoots				= null;				// Какой защитной одеждой пользовался оператор: Сапоги
	public CheckBox cbSafClothingAbsent				= null;				// Какой защитной одеждой пользовался оператор: Отсутствуют

	//********** Здоровье человека **********
	public EditText edtClothing						= null;				// Сборная колонка
	//public View spiHlthProtectiveClothingClean		= null;				// Защитная одежда чистая и в хорошем состоянии

	public View spiHlthProtectiveClothingClean		= null; //"hlth_safety_clothing_clean boolean," + //Защитная одежда чистая и в хорошем состоянии (В 2024 сказали оставить только в форме по ЗЧ и ОС)
	public EditText edtHlthClothingState			= null; //"hlth_clothing_state text," + //H Замечания относительно типа и состояния средств индивидуальной защиты
	public View spiHlthClothingReserve				= null; //"hlth_clothing_reserve boolean," + //H В бригаде или на ближайшей противосаранчовой базе имеется запасная защитная одежда (в частности, комбинезоны и перчатки)
	public EditText edtHlthOperatorPassport			= null; //"hlth_operator_passport integer," + //H Количество операторов с паспортами  использования пестицидов
	public EditText edtHlthFilledPassport			= null; //"hlth_filled_passport integer," + //H Количество правильно заполненных паспортов использования пестицидов
	public View spiHlthInhibition					= null; //"hlth_inhibition boolean," + //H Во время мониторинга измерялось ли ингибирование холинэстеразы?

	public View spiOperatorExposedInsecticide		= null;
	public EditText edtDescription					= null;

	public EditText edtHlthDescription				= null; //"hlth_description text," + //H Дополнительные сведения о случайном воздействии или отравлении


	// ********** Состояние окружающей среды **********
	public CheckBox cbTripleRinsed					= null; // Пустые контейнеры
	public CheckBox cbPunctured						= null; // Пустые контейнеры
	public CheckBox cbTakenBackToBase				= null; // Пустые контейнеры
	public CheckBox cbLeftInField					= null; // Пустые контейнеры
	public CheckBox cbBuried						= null; // Пустые контейнеры
	public CheckBox cbBurned						= null; // Пустые контейнеры
	public EditText edtSafEmptyContainers			= null;	 // Пустые контейнеры (Для накопления значений выбора галочек пустых контейнеров)

	public View spiSafObservedPollution				= null; //H Наблюдалось или сообщалось о случайном загрязнении? (например, разлив инсектицидов, неправильная очистка оборудования и т. д.)
	public EditText edtSafTypePollution				= null; //H Если Да, то где и какой тип загрязнения?

	public View spiSafNonTarget						= null; // воздействие на нецелевые организмы
	public EditText edtSafNonTargetEffect			= null; // если да, то какое

	public View	spiSafNonTarget2					= null; //"safety_non_target boolean," + // Наблюдалось или сообщалось о воздействии на нецелевые организмы? (например, болезни домашнего скота, смертность рыб, гибель пчел и т.д.)
	public EditText edtSafNonTargetEffect2			= null; //"safety_non_target_effect text," + // Если Да, то где и какое воздействие?
	public EditText edtSafNonTargetEffectPerson		= null; //"safety_non_target_effect_person text," + // Если информация поступила от прочих лиц, от кого именно? (укажите имя, номер телефона, адрес)

	public View spiSafIncident						= null; // Другие инциденты по здоровью или окружающей среде, возникшие при обработке
	public EditText edtSafIncidentEffect			= null; // Если Да, тип инцидента и кем сообщен (описание)

	public View	spiSafControl						= null; //"safety_Control boolean," + // Осуществлялся ли бригадой по мониторингу ЗЧ и ОС контроль в отношении наблюдаемого или зарегистрированного воздействия на окружающую среду
	public EditText edtSafControlActions			= null; //"safety_Control_Actions text," + // Если Да, опишите последующее действие(я)

	public View	spiMapTreatment						= null; //"map_treatment boolean," + // Была ли составлена ситуационная карта обработки?
	public EditText edtImage1 = null; // Фотография
	public EditText edtImage2 = null; // Фотография
	public EditText edtImage3 = null; // Фотография
	public EditText edtImage4 = null; // Фотография
	public EditText edtImage5 = null; // Фотография

	public EditText edtComments					= null;				// КОММЕНТАРИИ


	//********** Оценки риска **********
	public View spiRiskHouse						= null; //H Имеются ли в непосредственной близости от обработок жилые дома или жилье (в радиусе 2 км вокруг обрабатываемого участка)
	public EditText edtRiskHouseDistance			= null; //H Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего жилья:
	public View spiRiskHouseBufferZones				= null; //H Соблюдались ли буферные зоны?
	public View spiRiskHouseImpact					= null; //H Существует ли вероятность воздействия на жилые дома/жилье?
	public View spiRiskHouseInformed				= null; //H Были ли проинформированы жители о применении инсектицидов? (проверка бригадой по мониторингу)
	public View spiRiskWater						= null; //H Имеются ли в непосредственной близости от обработок поверхностные воды (в радиусе 2 км вокруг обрабатываемого участка)
	public EditText edtRiskWaterDistance			= null; //H Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего источника поверхностной воды:
	public View spiRiskWaterBufferZones				= null; //H Соблюдались ли буферные зоны?
	public View spiRiskWaterImpact					= null; //H Существует ли вероятность воздействия на поверхностные воды?
	public View spiRiskApiary						= null; //H Имеются ли в непосредственной близости от обработок пчеловодства (в радиусе 5 км вокруг обрабатываемого участка)
	public EditText edtRiskApiaryDistance			= null; //H Расстояние от ближайшего края обрабатываемого участка (м) до пасеки
	public View spiRiskApiaryInformed				= null; //H Были ли пчеловоды проинформированы о применении инсектицидов
	public EditText edtRiskApiaryMeasure			= null; //H Какие меры были предприняты для снижения отрицательного воздействия на пчел
	public View spiRiskApiaryImpact					= null; //H Существует ли вероятность воздействия на пчел
	public View spiRiskAgricultural					= null; //H Были ли обработаны или подверглись воздействию какие-либо сельхозкультуры?
	public EditText edtRiskAgriculturalName			= null; //H Наименование сельхозкультуры
	public EditText edtRiskAgriculturalPhase		= null; //H Фаза развития сельхозкультуры
	public View spiRiskAgriculturalToxic			= null; //H Наблюдалась ли фитотоксичность
	public View spiRiskAgriculturalInform			= null; //H Были ли фермеры проинформированы о предуборочном периоде
	public View spiRiskSilk							= null; //H Имеются ли в непосредственной близости от обработок шелководства (в радиусе 2 км вокруг обрабатываемого участка)
	public EditText edtRiskSilkDistance				= null; //H Расстояние от ближайшего края обрабатываемого участка (м) до тутовой плантации
	public View spiRiskSilkInform					= null; //H Были ли шелководы проинформированы о применении инсектицидов?
	public EditText edtRiskSilkTreesMeasure			= null; //H Какие меры были предприняты для снижения отрицательного воздействия на тутовые деревья
	public View spiRiskSilkTreesImpact				= null; //H Существует ли вероятность воздействия на тутовые деревья
	public View spiRiskPastures						= null; //H Были ли обработаны луга или пастбища?
	public View spiRiskPasturesInform				= null; //H Были ли пастухи проинформированы о периодах удержания домашнего скота?
	public View spiRiskPark							= null; //H Имеются ли в непосредственной близости от обработок другие экологически чувствительные зоны (например, национальный парк, заповедник) (в радиусе 2 км вокруг обрабатываемого участка)
	public EditText edtRiskParkType					= null; //H Какой тип экологически чувствительной зоны
	public EditText edtRiskParkDistance				= null; //H Расстояние от ближайшего края обрабатываемого участка (м) до экологически чувствительной зоны
	public View spiRiskParkBufferZones				= null; //H Соблюдались ли буферные зоны?
	public View spiRiskParkImpact					= null; //H Существует ли вероятность воздействия на экологически чувствительные зоны?

	//********** Отбор проб для анализа остатков **********
	public View spiRiskProbeAnalysis				= null; //H Пробы, взятые для анализа остатков
	public EditText edtRiskProbeAnalysisName		= null; //H Проба какого субстрата или организма была взята
	public EditText edtRiskProbeAnalysisNumber		= null; //H Регистрационный номер формы отбора проб



	public View btnOk							= null;
	public View btnCancel						= null;
	public View btnGetGPSCenter2				= null;
	public View btnDelGPSCenter2				= null;
	public View btnOnMap						= null;

	public View btnImage1						= null;
	public View btnImage2						= null;
	public View btnImage3						= null;
	public View btnImage4						= null;
	public View btnImage5						= null;
	//public View btnShowImage1					= null;
	//public View btnShowImage2					= null;
	//public View btnShowImage3					= null;
	//public View btnShowImage4					= null;
	//public View btnShowImage5					= null;
	public View btnDelImage1					= null;
	public View btnDelImage2					= null;
	public View btnDelImage3					= null;
	public View btnDelImage4					= null;
	public View btnDelImage5					= null;

	//private Uri mImageUri						= null;
	private DBGUITable		guiTableDel			= null;
	private DBGUITable		guiTableHealth		= null;

	public CheckBox cbTest; //Тестовая ли анкета
	public View btnInfoSafNonTargetEffectPerson	= null;

	private boolean isInRange(double a, double b, double c)
	{
		return b > a ? c >= a && c <= b : c >= b && c <= a;
    }

	public String checkMinMaxI(EditText txt, double min, double max)
	{
		try{
            double input = Double.parseDouble(txt.getText().toString());
            if (isInRange(min, max, input))
                return "";
            else 
            	return "MIN="+ Double.toString(min)+" MAX="+ Double.toString(max)+" !";
        } catch (NumberFormatException nfe) { }
		return "";
	}

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_locust_health);

		//Загрузка сохранёного языка
		Tools.loadLocale(this);
		
		DbOpenHelper dboh;
		Cursor cursor;

		Intent intent = getIntent();
		frmlocustdel_uid = intent.getStringExtra("frmlocustdel_uid"); // Параметр для Активити
		frmlocusthealth_uid = intent.getStringExtra("frmlocusthealth_uid"); // Параметр для Активити

		guiTableDel = new DBGUITable(this, "frmlocustdel");
		guiTableDel.add(frmlocustdel_uid, "uid");
		guiTableHealth = new DBGUITable(this, "frmlocusthealth");
		guiTableHealth.add(frmlocusthealth_uid, "uid");
		guiTableHealth.add(frmlocustdel_uid, "frmlocustdel_uid"); //Связь с формой обследования саранчи

		//Страна
		spiCountry = findViewById(R.id.spiCountry);
		guiTableDel.add(spiCountry, "country_id");
		((selectDB)spiCountry).addField("", "");
		// Выбираем страны и заполняем поля
		dboh = new DbOpenHelper(this);
		SQLiteDatabase rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select id, uid, name from countries where del=0 order by name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiCountry).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();
		spiCountry.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return true; // Перехватываем все события касания
			}
		});

		//Область
		spiRegion = findViewById(R.id.spiRegion); // Регион
		guiTableDel.add(spiRegion, "region_id");
		((selectDB)spiRegion).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select id, name from countriesregions where del=0 order by name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiRegion).addField(cursor.getString(cursor.getColumnIndex("name")),
							cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		spiRegion.setOnTouchListener(new View.OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				return true; // Перехватываем все события касания
			}
		});
		//Район
		edtArea = (EditText) findViewById(R.id.edtArea); // Район
		guiTableDel.add(edtArea, "area");
		//Посёлок
		edtVillage = (EditText) findViewById(R.id.edtVillage); // Название местности либо урочища
		guiTableDel.add(edtVillage, "village");
		//Имя лидера команды по обработке
		edtObserver = (EditText) findViewById(R.id.edtObserver);
		guiTableDel.add(edtObserver, "observer");
		//Дата
		edtDate = (EditText) findViewById(R.id.edtDate); // Должна быть уникальной
		guiTableDel.add(edtDate, "date");
		//Событие для кнопки выбора даты тут не нужна поэтому её и нет

		edtLatCenter = (EditText) findViewById(R.id.edtLatCenter); // Широта
		guiTableDel.add(edtLatCenter, "lat_center");
		edtLonCenter = (EditText) findViewById(R.id.edtLonCenter); // Долгота
		guiTableDel.add(edtLonCenter, "lon_center");

		ArrayList<LatLon> latlon = new ArrayList<LatLon>();
		latlon.add(new LatLon(UUID.randomUUID().toString(),0, 0));
		latlonList = findViewById(R.id.latlonList);
		LatLonAdapter adapter = new LatLonAdapter(this, R.layout.list_lat_lon, latlon, this, latlonList, true);
		latlonList.setAdapter(adapter);
//		adapter.clc=new OnClickListener() {
//			@Override
//			public void onClick(View view) {
//				Tools.setListViewHeightBasedOnItems(LocustHealthActivity.this.latlonList);
//			}
//		};


		//sql = "ALTER TABLE frmlocusthealth ADD timezone text;";
		//db.execSQL(sql);


		//**********Идентификация места мониторинга**********

		//H Имя руководителя бригады по мониторингу ЗЧ и ОС
		edtObserverHealth = (EditText) findViewById(R.id.edtObserverHealth);
		guiTableHealth.add(edtObserverHealth, "observer");
		//H Дата мониторинга
		edtMonitoringDate = (EditText) findViewById(R.id.edtMonitoringDate);
		guiTableHealth.add(edtMonitoringDate, "date");
		//H Временная зона для: Дата мониторинга
		edtMonitoringTimeZone = (EditText) findViewById(R.id.edtMonitoringTimeZone);
		guiTableHealth.add(edtMonitoringTimeZone,"timezone");
		View btnMonitoringGetDate = (View) findViewById(R.id.btnMonitoringGetDate);
		btnMonitoringGetDate.setOnClickListener(new OnClickListenerDateTime((fieldDB)edtMonitoringDate,this));

		edtLatCenter2 = (EditText) findViewById(R.id.edtLatCenter2); // Широта
		guiTableHealth.add(edtLatCenter2, "lat_center");
		edtLonCenter2 = (EditText) findViewById(R.id.edtLonCenter2); // Долгота
		guiTableHealth.add(edtLonCenter2, "lon_center");

		//**********Бригада по обработке**********
		//H Количество работников в бригаде по обработке
		edtBrigadeCount = (EditText) findViewById(R.id.edtBrigadeCount);
		guiTableHealth.add(edtBrigadeCount, "brigade_count");
		//H Количество работников, ранее обученных обращению с инсектицидами и их применению
		edtBrigadeCountTrained = (EditText) findViewById(R.id.edtBrigadeCountTrained);
		guiTableHealth.add(edtBrigadeCountTrained, "brigade_count_trained");

		//**********Информация о растительности**********
		//Тип растительности
		spiVegType = findViewById(R.id.spiVegType); // Тип(Дикая, Культурная)
		guiTableDel.add(spiVegType, "vegetation_type_id");
		((selectDB)spiVegType).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_vegetation d where d.del=0 order by d.sort, d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiVegType).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//высота растительности
		edtVegHeight = (EditText) findViewById(R.id.edtVegHeight); // Высота (м)
		guiTableDel.add(edtVegHeight, "vegetation_height");

		//Густота растительного покрова
		spiVegCover = findViewById(R.id.spiVegCover); // Густота растительного покрова(%)
		guiTableDel.add(spiVegCover, "vegetation_cover_id");
		((selectDB)spiVegCover).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_cover d where d.del=0 order by d.sort, d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiVegCover).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//Наименование сельхоз культуры
		edtVegCrop = (EditText) findViewById(R.id.edtVegCrop); // Перечисление культур
		guiTableDel.add(edtVegCrop, "vegetation_crop");

		//**********Информация об инсектицидах**********
		// коммерческое название (Наименование инсектицида)
		edtInsName = (EditText) findViewById(R.id.edtInsName);
		guiTableDel.add(edtInsName, "insecticide_name");
		//H Номер партии препарата (если указан на контейнере)
		edtInsPartNumber = (EditText) findViewById(R.id.edtInsPartNumber);
		guiTableHealth.add(edtInsPartNumber, "insecticide_part_number");
		//H Дата производства или Срок годности (срок хранения)
		edtInsManufacturedDate = (EditText) findViewById(R.id.edtInsManufacturedDate);
		guiTableHealth.add(edtInsManufacturedDate, "insecticide_manufactured_date");
		View btnInsManufacturedDate = (View) findViewById(R.id.btnInsManufacturedDate);
		btnInsManufacturedDate.setOnClickListener(new OnClickListenerDateTime((fieldDB)edtInsManufacturedDate,this));

		// Наименование активного вещества отравы
		edtInsActiveSubstance = (EditText) findViewById(R.id.edtInsActiveSubstance);
		guiTableDel.add(edtInsActiveSubstance, "insecticide_active_substance");

		// концентрация(г д.в./л или%)
		edtInsConcentration = (EditText) findViewById(R.id.edtInsConcentration);
		guiTableDel.add(edtInsConcentration, "insecticide_concentration");
		//edtInsConcentration.setFilters(new InputFilter[] { new InputFilterMinMax("0", "100") }); потому что текст

		// формуляция(УМО, КЭ, др.)
		spiInsFormulation = findViewById(R.id.spiInsFormulation);
		guiTableDel.add(spiInsFormulation, "insecticide_formulation_id");
		((selectDB)spiInsFormulation).addField("", "");
		// Выбираем страны и заполняем поля
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_formulation d where d.del=0 order by d.sort, d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiInsFormulation).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// норма расхода(л/га)
		edtInsDose = (EditText) findViewById(R.id.edtInsDose);
		guiTableDel.add(edtInsDose, "insecticide_dose");

		// Коммерческий припарат разбавлен?
		spiInsDiluted = findViewById(R.id.spiInsDiluted);
		guiTableDel.add(spiInsDiluted, "insecticide_diluted_id");
		((selectDB)spiInsDiluted).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor =null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_diluted d where d.del=0 order by d.sort, d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiInsDiluted).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// Если применимо: Коэффициент разбавления рабочего раствора (л или кг коммерческого препарата/л воды или дизельного топлива)
		edtInsProportion = (EditText) findViewById(R.id.edtInsProportion);
		guiTableDel.add(edtInsProportion, "insecticide_proportion");

		// расход рабочей жидкости(л/га)
		edtInsRate = (EditText) findViewById(R.id.edtInsRate);
		guiTableDel.add(edtInsRate, "insecticide_rate");

		//H Состояние пакетов или контейнеров с инсектицидами
		spiInsContainerState = findViewById(R.id.spiInsContainerState);
		guiTableHealth.add(spiInsContainerState, "insecticide_container_state_id");
		((selectDB)spiInsContainerState).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_containers_states d where d.del=0 order by d.sort, d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiInsContainerState).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//**********Погодные условия**********
		// время начала
		spiWeaTimeStart = findViewById(R.id.spiWeaTimeStart);
		guiTableDel.add(spiWeaTimeStart, "weather_time_start");
		((selectDB)spiWeaTimeStart).addField("", "");
		for (int i = 0; i < 24; i++) {
			((selectDB) spiWeaTimeStart).addField(String.valueOf(i), String.valueOf(i)+".0");
		}
		// время окончания
		spiWeaTimeEnd = findViewById(R.id.spiWeaTimeEnd);
		guiTableDel.add(spiWeaTimeEnd, "weather_time_end");
		((selectDB)spiWeaTimeEnd).addField("", "");
		for (int i = 0; i < 24; i++) {
			((selectDB) spiWeaTimeEnd).addField(String.valueOf(i), String.valueOf(i)+".0");
		}
		// Температура нач.(°C)
		edtWeaTemperatureStart = (EditText) findViewById(R.id.edtWeaTemperatureStart);
		guiTableDel.add(edtWeaTemperatureStart, "weather_temperature_start");
		// Температура кон.(°C)
		edtWeaTemperatureEnd = (EditText) findViewById(R.id.edtWeaTemperatureEnd);
		guiTableDel.add(edtWeaTemperatureEnd, "weather_temperature_end");

		// направление ветра нач.
		spiWindDirectionStart = findViewById(R.id.spiWindDirectionStart);
		guiTableDel.add(spiWindDirectionStart, "weather_direction_start");
		((selectDB)spiWindDirectionStart).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 order by d.degree", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiWindDirectionStart).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// направление ветра кон.
		spiWindDirectionEnd = findViewById(R.id.spiWindDirectionEnd);
		guiTableDel.add(spiWindDirectionEnd, "weather_direction_end");
		((selectDB)spiWindDirectionEnd).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 order by d.degree", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiWindDirectionEnd).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// направление опрыскивания нач.
		spiSprayDirectionStart = findViewById(R.id.spiSprayDirectionStart);
		guiTableDel.add(spiSprayDirectionStart, "weather_spray_direction_start");
		((selectDB)spiSprayDirectionStart).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name, d.degree from list_directions d where d.del=0 and d.degree>=0 order by d.degree",
							null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprayDirectionStart).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// направление опрыскивания кон.
		spiSprayDirectionEnd = findViewById(R.id.spiSprayDirectionEnd);
		guiTableDel.add(spiSprayDirectionEnd, "weather_spray_direction_end");
		((selectDB)spiSprayDirectionEnd).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name, degree from list_directions d where d.del=0 and d.degree>=0 order by d.degree",
							null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprayDirectionEnd).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//**********Информация о саранчовых**********
		// Вид locuststypes
		spiLocSpecies = findViewById(R.id.spiLocSpecies);
		guiTableDel.add(spiLocSpecies, "locust_type_id");
		((selectDB)spiLocSpecies).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),lt.name) name from LocustsTypes lt where lt.del=0 order by lt.sort,lt.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiLocSpecies).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();
		// Возраст личинок (Стадии личинок)
		spiLocHoppers = findViewById(R.id.spiLocHoppers);
		guiTableDel.add(spiLocHoppers, "locust_hoppers_id");
		((selectDB)spiLocHoppers).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),lt.name) name from list_age lt where lt.del=0 order by lt.sort,lt.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiLocHoppers).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();
		// плотность на м2
		edtLocDensity = (EditText) findViewById(R.id.edtLocDensity);
		guiTableDel.add(edtLocDensity, "locust_density");

		//Основная цель при обработке
		spiMainPurpose = findViewById(R.id.spiMainPurpose);
		guiTableDel.add(spiMainPurpose, "locust_purpose_id");
		((selectDB)spiMainPurpose).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select lt.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = lt.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),lt.name) name from list_purpose lt where lt.del=0 order by lt.sort,lt.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiMainPurpose).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//**********Сведения по опрыскиванию**********
		// Вид опрыскивания
		spiSprPlatform = findViewById(R.id.spiSprPlatform);
		guiTableDel.add(spiSprPlatform, "spray_platform");
		((selectDB)spiSprPlatform).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from sprayers_types d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprPlatform).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан».
		spiSprPlatformA = findViewById(R.id.spiSprPlatformA);
		guiTableDel.add(spiSprPlatformA, "spray_platform_a");
		((selectDB)spiSprPlatformA).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=1 order by d.sort,d.name",
							null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprPlatformA).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG».
		spiSprPlatformG = findViewById(R.id.spiSprPlatformG);
		guiTableDel.add(spiSprPlatformG, "spray_platform_g");
		((selectDB)spiSprPlatformG).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=3 order by d.sort,d.name",
							null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprPlatformG).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный».
		spiSprPlatformH = findViewById(R.id.spiSprPlatformH);
		guiTableDel.add(spiSprPlatformH, "spray_platform_h");
		((selectDB)spiSprPlatformH).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from sprayers d where d.del=0 and d.sprayer_type_id=5 order by d.sort,d.name",
							null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprPlatformH).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// Марка опрыскивателя
		edtSprManufacturer = (EditText) findViewById(R.id.edtSprManufacturer);
		guiTableDel.add(edtSprManufacturer, "spray_manufacturer_name");

		// Высота над поверхностью почвы (м)
		edtSprHeight = (EditText) findViewById(R.id.edtSprHeight);
		guiTableDel.add(edtSprHeight, "spray_height");

		//H Механическая безопасность: наблюдалась ли утечка инсектицида?
		spiSprLeak = findViewById(R.id.spiSprLeak);
		guiTableHealth.add(spiSprLeak, "spr_leak");
		((selectDB)spiSprLeak).addField("", "");
		((selectDB)spiSprLeak).addField(getString(R.string.Yes), "1");
		((selectDB)spiSprLeak).addField(getString(R.string.No), "0");

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSprLeak).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSprLeakPlace = findViewById(R.id.llSprLeakPlace);
				if(((selectDB)spiSprLeak).getValue() != null && ((selectDB)spiSprLeak).getValue().equals("1")) {
					llSprLeakPlace.setVisibility(View.VISIBLE);
				}else{
					edtSprLeakPlace.setText("");
					llSprLeakPlace.setVisibility(View.GONE);
				}
			}
		});

		//H Если Да, в какой части опрыскивателя имеется утечка?
		edtSprLeakPlace = (EditText) findViewById(R.id.edtSprLeakPlace);
		guiTableHealth.add(edtSprLeakPlace, "spr_leak_place");
		//H Система опрыскивания: повреждены распылители или сопла?
		spiSprDamage = findViewById(R.id.spiSprDamage);
		guiTableHealth.add(spiSprDamage, "spr_damage");
		((selectDB)spiSprDamage).addField("", "");
		((selectDB)spiSprDamage).addField(getString(R.string.Yes), "1");
		((selectDB)spiSprDamage).addField(getString(R.string.No), "0");

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSprDamage).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSprDamagePlace = findViewById(R.id.llSprDamagePlace);
				if(((selectDB)spiSprDamage).getValue() != null && ((selectDB)spiSprDamage).getValue().equals("1")) {
					llSprDamagePlace.setVisibility(View.VISIBLE);
				}else{
					edtSprDamagePlace.setText("");
					llSprDamagePlace.setVisibility(View.GONE);
				}
			}
		});

		//H Если Да, какие повреждения?
		edtSprDamagePlace = (EditText) findViewById(R.id.edtSprDamagePlace);
		guiTableHealth.add(edtSprDamagePlace, "spr_damage_place");


		// **********Сведения по опрыскиванию**********
		// Тип обработки
		spiSprBarrier = findViewById(R.id.spiSprBarrier);
		guiTableDel.add(spiSprBarrier, "spray_barrier");
		((selectDB)spiSprBarrier).addField("", "");
		((selectDB)spiSprBarrier).addField(getString(R.string.Barriers), "1");
		((selectDB)spiSprBarrier).addField(getString(R.string.Continuous), "0");

		// Интервал между проходами
		edtSprBarrierSpace = (EditText) findViewById(R.id.edtSprBarrierSpace);
		guiTableDel.add(edtSprBarrierSpace, "spray_barrier_space");

		// Скорость движения (км/ч)
		edtSprSpeed = (EditText) findViewById(R.id.edtSprSpeed);
		guiTableDel.add(edtSprSpeed, "spray_speed");

		// Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет)
		spiSprMarking = findViewById(R.id.spiSprMarking);
		guiTableDel.add(spiSprMarking, "spray_marking_id");
		((selectDB)spiSprMarking).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_markings d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiSprMarking).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		// обработанная площадь(га)
		edtTreatedArea = (EditText) findViewById(R.id.edtTreatedArea);
		guiTableDel.add(edtTreatedArea, "treated_area");

		//H Обработанная площадь (проверено бригадой по мониторингу) (га)
		edtTreatedAreaCheck = (EditText) findViewById(R.id.edtTreatedAreaCheck);
		guiTableHealth.add(edtTreatedAreaCheck, "spr_treated_area_check");

		// Общий объем использованной рабочей жидкости (л)
		edtInsUsedVolume = (EditText) findViewById(R.id.edtInsUsedVolume);
		guiTableDel.add(edtInsUsedVolume, "insecticide_used_volume");

		//H Фактическая норма объема опрыскивания (л/га)
		edtSprFactVolume = (EditText) findViewById(R.id.edtSprFactVolume);
		guiTableHealth.add(edtSprFactVolume, "spr_fact_volume");

		//H Если проводилось наблюдение за опрыскиванием: соблюдалась ли надлежащая практика применения инсектицидов?
		spiSprObservation = findViewById(R.id.spiSprObservation);
		guiTableHealth.add(spiSprObservation, "spr_observation");
		((selectDB)spiSprObservation).addField("", "");
		((selectDB)spiSprObservation).addField(getString(R.string.Yes), "1");
		((selectDB)spiSprObservation).addField(getString(R.string.No), "0");

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSprObservation).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSprDescription = findViewById(R.id.llSprDescription);
				if(((selectDB)spiSprObservation).getValue() != null && ((selectDB)spiSprObservation).getValue().equals("1")) {
					llSprDescription.setVisibility(View.VISIBLE);
				}else{
					edtSprDescription.setText("");
					llSprDescription.setVisibility(View.GONE);
				}
			}
		});

		//H Замечания относительно наблюдаемой практики опрыскивания
		edtSprDescription = (EditText) findViewById(R.id.edtSprDescription);
		guiTableHealth.add(edtSprDescription, "spr_description");

		//********** Калибровка опрыскивателя **********
		//H Калибровка расхода жидкости: проверялся ли расход жидкости опрыскивателя во время мониторинга?
		spiCalibrConsumptionCheck = findViewById(R.id.spiCalibrConsumptionCheck);
		guiTableHealth.add(spiCalibrConsumptionCheck, "calibr_consumption_check");
		((selectDB)spiCalibrConsumptionCheck).addField("", "");
		((selectDB)spiCalibrConsumptionCheck).addField(getString(R.string.Yes), "1");
		((selectDB)spiCalibrConsumptionCheck).addField(getString(R.string.No), "0");

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiCalibrConsumptionCheck).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llCalibrTime = findViewById(R.id.llCalibrTime);
				LinearLayout llCalibrVolume  = findViewById(R.id.llCalibrVolume);
				LinearLayout llCalibrRate = findViewById(R.id.llCalibrRate);
				if(((selectDB)spiCalibrConsumptionCheck).getValue() != null && ((selectDB)spiCalibrConsumptionCheck).getValue().equals("1")) {
					llCalibrTime.setVisibility(View.VISIBLE);
					llCalibrVolume.setVisibility(View.VISIBLE);
					llCalibrRate.setVisibility(View.VISIBLE);
				}else{
					edtCalibrTime.setText("");
					edtCalibrVolume.setText("");
					edtCalibrRate.setText("");
					llCalibrTime.setVisibility(View.GONE);
					llCalibrVolume.setVisibility(View.GONE);
					llCalibrRate.setVisibility(View.GONE);
				}
			}
		});

		//H Время калибровки (мин.):
		edtCalibrTime = (EditText) findViewById(R.id.edtCalibrTime);
		guiTableHealth.add(edtCalibrTime, "calibr_time");
		//H Собранный объем (л):
		edtCalibrVolume = (EditText) findViewById(R.id.edtCalibrVolume);
		guiTableHealth.add(edtCalibrVolume, "calibr_volume");
		//H Расход жидкости (л/мин):
		edtCalibrRate = (EditText) findViewById(R.id.edtCalibrRate);
		guiTableHealth.add(edtCalibrRate, "calibr_rate");
		//H Качество применения: проверялось ли осаждение капель во время мониторинга?
		spiCalibrPrecipitation = findViewById(R.id.spiCalibrPrecipitation);
		guiTableHealth.add(spiCalibrPrecipitation, "calibr_precipitation");
		((selectDB)spiCalibrPrecipitation).addField("", "");
		((selectDB)spiCalibrPrecipitation).addField(getString(R.string.Yes), "1");
		((selectDB)spiCalibrPrecipitation).addField(getString(R.string.No), "0");

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiCalibrPrecipitation).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llCalibrWidthCard = findViewById(R.id.llCalibrWidthCard);
				LinearLayout llCalibrWindSpeed  = findViewById(R.id.llCalibrWindSpeed);
				LinearLayout llCalibrDropletCoating = findViewById(R.id.llCalibrDropletCoating);
				LinearLayout llCalibrPassesInterval = findViewById(R.id.llCalibrPassesInterval);
				if(((selectDB)spiCalibrPrecipitation).getValue() != null && ((selectDB)spiCalibrPrecipitation).getValue().equals("1")) {
					llCalibrWidthCard.setVisibility(View.VISIBLE);
					llCalibrWindSpeed.setVisibility(View.VISIBLE);
					llCalibrDropletCoating.setVisibility(View.VISIBLE);
					llCalibrPassesInterval.setVisibility(View.VISIBLE);
				}else{
					edtCalibrWidthCard.setText("");
					edtCalibrWindSpeed.setText("");
					edtCalibrDropletCoating.setText("");
					edtCalibrPassesInterval.setText("");
					llCalibrWidthCard.setVisibility(View.GONE);
					llCalibrWindSpeed.setVisibility(View.GONE);
					llCalibrDropletCoating.setVisibility(View.GONE);
					llCalibrPassesInterval.setVisibility(View.GONE);
				}
			}
		});

		//H Длина трансекты, определенная с использованием масляно-/водочувствительной бумаги (м)
		edtCalibrWidthCard = (EditText) findViewById(R.id.edtCalibrWidthCard);
		guiTableHealth.add(edtCalibrWidthCard, "calibr_width_card");
		//H Средняя скорость ветра при осаждении капель (м/с)
		edtCalibrWindSpeed = (EditText) findViewById(R.id.edtCalibrWindSpeed);
		guiTableHealth.add(edtCalibrWindSpeed, "calibr_wind_speed");
		//H Ширина дорожки с хорошим покрытием капель (м)
		edtCalibrDropletCoating = (EditText) findViewById(R.id.edtCalibrDropletCoating);
		guiTableHealth.add(edtCalibrDropletCoating, "calibr_droplet_coating");
		//H Рекомендуемый интервал между проходами (м)
		edtCalibrPassesInterval = (EditText) findViewById(R.id.edtCalibrPassesInterval);
		guiTableHealth.add(edtCalibrPassesInterval, "calibr_passes_interval");

		//********** Контроль эфективности **********
		//Контроль эфективности
		spiEffControl = findViewById(R.id.spiEffControl);
		guiTableDel.add(spiEffControl, "efficiency");
		((selectDB)spiEffControl).addField("", "");
		((selectDB)spiEffControl).addField(getString(R.string.Yes), "1");
		((selectDB)spiEffControl).addField(getString(R.string.No), "0");
		if(findViewById(R.id.btnEffControl)!=null) {
			findViewById(R.id.btnEffControl).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Control_efficacy_conducted_control_team));
				}
			});
		}

		//Тип оцениваемого биологического воздействия
		/*spiEffTypeImpact = findViewById(R.id.spiEffTypeImpact);
		guiTableDel.add(spiEffTypeImpact, "efficacy_impact_id");
		((selectDB)spiEffTypeImpact).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_impact d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiEffTypeImpact).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();*/

		//Type of biological impact being assessed (I build a table of checkboxes)
		edtBiologicalImpact = findViewById(R.id.edtBiologicalImpact);
		guiTableDel.add(edtBiologicalImpact, "efficacy_impact");
		CompoundButton.OnCheckedChangeListener occlBiologicalImpact = new CompoundButton.OnCheckedChangeListener()
		{
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
			{
				StringBuilder val = new StringBuilder();
				// loop through all elements inside the GridLayout
				for (int i = 0; i < glBiologicalImpact.getChildCount(); i++) {
					View child = glBiologicalImpact.getChildAt(i);
					if (child instanceof CheckBox) {
						CheckBox cb = (CheckBox) child;
						if (cb.isChecked()) {
							val.append(cb.getTag().toString()).append(",");
						}
					}
				}
				// remove the last comma if there is one
				if (val.length() > 0 && val.charAt(val.length() - 1) == ',') {
					val.deleteCharAt(val.length() - 1);
				}
				// save in editText
				LocustHealthActivity.this.edtBiologicalImpact.setText(val.toString());
			}
		};

		edtBiologicalImpact.addTextChangedListener(new TextWatcher()
		{
			public void afterTextChanged(Editable s){}
			public void beforeTextChanged(CharSequence s, int start, int count, int after){}
			public void onTextChanged(CharSequence s, int start, int before, int count)
			{
				String str = LocustHealthActivity.this.edtBiologicalImpact.getText().toString();
				for (int i = 0; i < glBiologicalImpact.getChildCount(); i++) {
					View child = glBiologicalImpact.getChildAt(i);
					if (child instanceof CheckBox) {
						CheckBox cb = (CheckBox) child;
						String val = cb.getTag().toString();
						if(str.contains(val) && !cb.isChecked()) {
							cb.setChecked(true);
						}
					}
				}
			}
		});

		glBiologicalImpact = findViewById(R.id.glBiologicalImpact);
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
					+ Tools.getLang() + "' LIMIT 1),d.name) name from list_impact d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				int row = 0;
				int col = 0;
				int colCount = glBiologicalImpact.getColumnCount(); // например 2
				do
				{
					String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
					String id = cursor.getString(cursor.getColumnIndexOrThrow("id"));

					CheckBox cb = new CheckBox(this);
					cb.setEnabled(false);
					cb.setText(name);
					cb.setTag(id);
					cb.setLayoutParams(new GridLayout.LayoutParams(
							GridLayout.spec(row, 1f),   // row index
							GridLayout.spec(col, 1f)    // column index
					));
					cb.setOnCheckedChangeListener(occlBiologicalImpact);
					glBiologicalImpact.addView(cb);

					col++;
					if (col >= colCount) {
						col = 0;
						row++;
					}
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

//+++++++++++++++++++++++++++++++






		// Наблюдаемая эфективность обработок (%)
		edtEffMortality = (EditText) findViewById(R.id.edtEffMortality);
		guiTableDel.add(edtEffMortality, "efficacy_mortality");

		// Прошло времени после обработки
		edtEffPassedTime = (EditText) findViewById(R.id.edtEffPassedTime);
		guiTableDel.add(edtEffPassedTime, "efficacy_passed_time");

		// Метод оценки эфективности обработок
		spiEffMethod = findViewById(R.id.spiEffMethod);
		guiTableDel.add(spiEffMethod, "efficacy_mortality_method");
		((selectDB)spiEffMethod).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_mortality d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiEffMethod).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();

		//H Проведен ли контроль эффективности (бригада мониторинга)?
		spiEffControl2 = findViewById(R.id.spiEffControl2);
		guiTableHealth.add(spiEffControl2, "efficacy_control");
		((selectDB)spiEffControl2).addField("", "");
		((selectDB)spiEffControl2).addField(getString(R.string.Yes), "1");
		((selectDB)spiEffControl2).addField(getString(R.string.No), "0");
		if(findViewById(R.id.btnEffControl2)!=null) {
			findViewById(R.id.btnEffControl2).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Control_efficacy_conducted_monitoring_team));
				}
			});
		}
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiEffControl2).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llEffTypeImpact2 = findViewById(R.id.llEffTypeImpact2);
				LinearLayout llEffMortality2  = findViewById(R.id.llEffMortality2);
				LinearLayout llEffPassedTime2 = findViewById(R.id.llEffPassedTime2);
				LinearLayout llEffMethod2 = findViewById(R.id.llEffMethod2);
				if(((selectDB)spiEffControl2).getValue() != null && ((selectDB)spiEffControl2).getValue().equals("1")) {
					llEffTypeImpact2.setVisibility(View.VISIBLE);
					llEffMortality2.setVisibility(View.VISIBLE);
					llEffPassedTime2.setVisibility(View.VISIBLE);
					llEffMethod2.setVisibility(View.VISIBLE);
				}else{
					//((selectDB)spiEffTypeImpact2).setValue(null);
					edtEffMortality2.setText("");
					edtEffPassedTime2.setText("");
					((selectDB)spiEffMethod2).setValue(null);
					llEffTypeImpact2.setVisibility(View.GONE);
					llEffMortality2.setVisibility(View.GONE);
					llEffPassedTime2.setVisibility(View.GONE);
					llEffMethod2.setVisibility(View.GONE);
				}
			}
		});
		//H Тип оцениваемого биологического воздействия
		/*spiEffTypeImpact2 = findViewById(R.id.spiEffTypeImpact2);
		guiTableHealth.add(spiEffTypeImpact2, "efficacy_impact_type_id");
		((selectDB)spiEffTypeImpact2).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_impact d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiEffTypeImpact2).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();*/

		//Type of biological impact being assessed (I build a table of checkboxes)
		edtEffTypeImpact = findViewById(R.id.edtEffTypeImpact);
		guiTableHealth.add(edtEffTypeImpact, "efficacy_impact_type");
		CompoundButton.OnCheckedChangeListener occlEffTypeImpact = new CompoundButton.OnCheckedChangeListener()
		{
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
			{
				StringBuilder val = new StringBuilder();
				// loop through all elements inside the GridLayout
				for (int i = 0; i < glEffTypeImpact.getChildCount(); i++) {
					View child = glEffTypeImpact.getChildAt(i);
					if (child instanceof CheckBox) {
						CheckBox cb = (CheckBox) child;
						if (cb.isChecked()) {
							val.append(cb.getTag().toString()).append(",");
						}
					}
				}
				// remove the last comma if there is one
				if (val.length() > 0 && val.charAt(val.length() - 1) == ',') {
					val.deleteCharAt(val.length() - 1);
				}
				// save in editText
				LocustHealthActivity.this.edtEffTypeImpact.setText(val.toString());
			}
		};

		edtEffTypeImpact.addTextChangedListener(new TextWatcher()
		{
			public void afterTextChanged(Editable s){}
			public void beforeTextChanged(CharSequence s, int start, int count, int after){}
			public void onTextChanged(CharSequence s, int start, int before, int count)
			{
				String str = LocustHealthActivity.this.edtEffTypeImpact.getText().toString();
				for (int i = 0; i < glEffTypeImpact.getChildCount(); i++) {
					View child = glEffTypeImpact.getChildAt(i);
					if (child instanceof CheckBox) {
						CheckBox cb = (CheckBox) child;
						String val = cb.getTag().toString();
						if(str.contains(val) && !cb.isChecked()) {
							cb.setChecked(true);
						}
					}
				}
			}
		});

		glEffTypeImpact = findViewById(R.id.glEffTypeImpact);
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery("select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
					+ Tools.getLang() + "' LIMIT 1),d.name) name from list_impact d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				int row = 0;
				int col = 0;
				int colCount = glEffTypeImpact.getColumnCount(); // например 2
				do
				{
					String name = cursor.getString(cursor.getColumnIndexOrThrow("name"));
					String id = cursor.getString(cursor.getColumnIndexOrThrow("id"));

					CheckBox cb = new CheckBox(this);
					cb.setText(name);
					cb.setTag(id);
					cb.setLayoutParams(new GridLayout.LayoutParams(
							GridLayout.spec(row, 1f),   // row index
							GridLayout.spec(col, 1f)    // column index
					));
					cb.setOnCheckedChangeListener(occlEffTypeImpact);
					glEffTypeImpact.addView(cb);

					col++;
					if (col >= colCount) {
						col = 0;
						row++;
					}
				} while (cursor.moveToNext());
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();






		//H Наблюдаемая эффективность обработки (%)
		edtEffMortality2 = (EditText) findViewById(R.id.edtEffMortality2);
		guiTableHealth.add(edtEffMortality2, "efficacy_mortality");
		//H Прошло времени после обработки
		edtEffPassedTime2 = (EditText) findViewById(R.id.edtEffPassedTime2);
		guiTableHealth.add(edtEffPassedTime2, "efficacy_passed_time");
		//H Метод оценки эффективности обработки (выбор: подсчет квадратов; подсчет по разрезам; подсчет кулиг личинок; другое)
		spiEffMethod2 = findViewById(R.id.spiEffMethod2);
		guiTableHealth.add(spiEffMethod2, "efficacy_mortality_method_id");
		((selectDB)spiEffMethod2).addField("", "");
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getReadableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_mortality d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					((selectDB)spiEffMethod2).addField(cursor.getString(cursor.getColumnIndex("name")), cursor.getString(cursor.getColumnIndex("id")));
				} while (cursor.moveToNext());
			}
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();


		//**********Здоровье человека**********
		// Индивидуальные средства защиты
		cbSafClothingGoggles = (CheckBox) findViewById(R.id.cbSafClothingGoggles);
		cbSafClothingMasks = (CheckBox) findViewById(R.id.cbSafClothingMasks);
		cbSafClothingGloves = (CheckBox) findViewById(R.id.cbSafClothingGloves);
		cbSafClothingOveralls = (CheckBox) findViewById(R.id.cbSafClothingOveralls);
		cbSafClothingCaps = (CheckBox) findViewById(R.id.cbSafClothingCaps);
		cbSafClothingBoots = (CheckBox) findViewById(R.id.cbSafClothingBoots);
		cbSafClothingAbsent = (CheckBox) findViewById(R.id.cbSafClothingAbsent);

		edtClothing = (EditText) findViewById(R.id.edtClothing);
		guiTableDel.add(edtClothing, "safety_clothing");

		edtClothing.addTextChangedListener(new TextWatcher()
		{
			public void afterTextChanged(Editable s)
			{
			}

			public void beforeTextChanged(CharSequence s, int start, int count, int after)
			{
			}

			public void onTextChanged(CharSequence s, int start, int before, int count)
			{
				String str = LocustHealthActivity.this.edtClothing.getText().toString();

				if (str.indexOf("1") != -1)
					LocustHealthActivity.this.cbSafClothingGoggles.setChecked(true);
				if (str.indexOf("2") != -1)
					LocustHealthActivity.this.cbSafClothingMasks.setChecked(true);
				if (str.indexOf("3") != -1)
					LocustHealthActivity.this.cbSafClothingGloves.setChecked(true);
				if (str.indexOf("4") != -1)
					LocustHealthActivity.this.cbSafClothingOveralls.setChecked(true);
				if (str.indexOf("5") != -1)
					LocustHealthActivity.this.cbSafClothingCaps.setChecked(true);
				if (str.indexOf("6") != -1)
					LocustHealthActivity.this.cbSafClothingBoots.setChecked(true);
				if (str.indexOf("7") != -1)
					LocustHealthActivity.this.cbSafClothingAbsent.setChecked(true);

			}
		});

		//H Защитная одежда читая и в хорошем состоянии (теперь в этой анкете)
		spiHlthProtectiveClothingClean = findViewById(R.id.spiHlthProtectiveClothingClean);
		guiTableHealth.add(spiHlthProtectiveClothingClean, "hlth_safety_clothing_clean");
		((selectDB)spiHlthProtectiveClothingClean).addField("", "");
		((selectDB)spiHlthProtectiveClothingClean).addField(getString(R.string.Yes), "1");
		((selectDB)spiHlthProtectiveClothingClean).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiHlthProtectiveClothingClean).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llHlthClothingState = findViewById(R.id.llHlthClothingState);
				if(((selectDB)spiHlthProtectiveClothingClean).getValue() != null && !((selectDB)spiHlthProtectiveClothingClean).getValue().equals("1")) {
					llHlthClothingState.setVisibility(View.VISIBLE);
				}else{
					edtHlthClothingState.setText("");
					llHlthClothingState.setVisibility(View.GONE);
				}
			}
		});

		//H Замечания относительно типа и состояния средств индивидуальной защиты
		edtHlthClothingState = (EditText) findViewById(R.id.edtHlthClothingState);
		guiTableHealth.add(edtHlthClothingState, "hlth_clothing_state");

		//H В бригаде или на ближайшей противосаранчовой базе имеется запасная защитная одежда (в частности, комбинезоны и перчатки)
		spiHlthClothingReserve = findViewById(R.id.spiHlthClothingReserve);
		guiTableHealth.add(spiHlthClothingReserve, "hlth_clothing_reserve");
		((selectDB)spiHlthClothingReserve).addField("", "");
		((selectDB)spiHlthClothingReserve).addField(getString(R.string.Yes), "1");
		((selectDB)spiHlthClothingReserve).addField(getString(R.string.No), "0");
		//H Количество операторов с паспортами использования пестицидов
		edtHlthOperatorPassport = (EditText) findViewById(R.id.edtHlthOperatorPassport);
		guiTableHealth.add(edtHlthOperatorPassport, "hlth_operator_passport");
		//H Количество правильно заполненных паспортов использования пестицидов
		edtHlthFilledPassport = (EditText) findViewById(R.id.edtHlthFilledPassport);
		guiTableHealth.add(edtHlthFilledPassport, "hlth_filled_passport");
		//H Во время мониторинга измерялось ли ингибирование холинэстеразы?
		spiHlthInhibition = findViewById(R.id.spiHlthInhibition);
		guiTableHealth.add(spiHlthInhibition, "hlth_inhibition");
		((selectDB)spiHlthInhibition).addField("", "");
		((selectDB)spiHlthInhibition).addField(getString(R.string.Yes), "1");
		((selectDB)spiHlthInhibition).addField(getString(R.string.No), "0");

		//Оператор случайно подвергся воздействию инсектицида или плохое самочувствие
		spiOperatorExposedInsecticide = findViewById(R.id.spiOperatorExposedInsecticide);
		guiTableDel.add(spiOperatorExposedInsecticide, "safety_operator_health");
		((selectDB)spiOperatorExposedInsecticide).addField("", "");
		((selectDB)spiOperatorExposedInsecticide).addField(getString(R.string.Yes), "1");
		((selectDB)spiOperatorExposedInsecticide).addField(getString(R.string.No), "0");

		// если да, то какое
		edtDescription = (EditText) findViewById(R.id.edtDescription);
		guiTableDel.add(edtDescription, "description");

		//H Дополнительные сведения о случайном воздействии или отравлении
		edtHlthDescription = (EditText) findViewById(R.id.edtHlthDescription);
		guiTableHealth.add(edtHlthDescription, "hlth_description");

		//**********Состояние окружающей среды**********
		// Пустые контейнеры (выборка локализованных названий)
		dboh = new DbOpenHelper(this);
		rdb = null;
		cursor = null;
		try {
			rdb = dboh.getWritableDatabase();
			cursor = rdb.rawQuery(
							"select d.id, COALESCE((SELECT translation FROM _translations t JOIN _languages l ON t.language_id=l.id WHERE t.del = 0 AND identifier = d.name AND l.short_name='"
									+ Tools.getLang() + "' LIMIT 1),d.name) name from list_containers d where d.del=0 order by d.sort,d.name", null);
			if (cursor.moveToFirst())
			{
				do
				{
					if(cursor.getLong(cursor.getColumnIndex("id"))==1)
						((CheckBox) findViewById(R.id.cbTripleRinsed)).setText(cursor.getString(cursor.getColumnIndex("name")));
					if(cursor.getLong(cursor.getColumnIndex("id"))==2)
						((CheckBox) findViewById(R.id.cbPunctured)).setText(cursor.getString(cursor.getColumnIndex("name")));
					if(cursor.getLong(cursor.getColumnIndex("id"))==3)
						((CheckBox) findViewById(R.id.cbTakenBackToBase)).setText(cursor.getString(cursor.getColumnIndex("name")));
					if(cursor.getLong(cursor.getColumnIndex("id"))==4)
						((CheckBox) findViewById(R.id.cbLeftInField)).setText(cursor.getString(cursor.getColumnIndex("name")));
					if(cursor.getLong(cursor.getColumnIndex("id"))==5)
						((CheckBox) findViewById(R.id.cbBuried)).setText(cursor.getString(cursor.getColumnIndex("name")));
					if(cursor.getLong(cursor.getColumnIndex("id"))==6)
						((CheckBox) findViewById(R.id.cbBurned)).setText(cursor.getString(cursor.getColumnIndex("name")));
				} while (cursor.moveToNext());
			}
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();
		//Тут сам выбор значений из базы
		edtSafEmptyContainers = (EditText) findViewById(R.id.edtSafEmptyContainers);
		guiTableDel.add(edtSafEmptyContainers, "safety_container");
		edtSafEmptyContainers.addTextChangedListener(new TextWatcher()
		{
			public void afterTextChanged(Editable s){}
			public void beforeTextChanged(CharSequence s, int start, int count, int after){}
			public void onTextChanged(CharSequence s, int start, int before, int count)
			{
				String str = LocustHealthActivity.this.edtSafEmptyContainers.getText().toString();
				if (str.indexOf("1") != -1)
					LocustHealthActivity.this.cbTripleRinsed.setChecked(true);
				if (str.indexOf("2") != -1)
					LocustHealthActivity.this.cbPunctured.setChecked(true);
				if (str.indexOf("3") != -1)
					LocustHealthActivity.this.cbTakenBackToBase.setChecked(true);
				if (str.indexOf("4") != -1)
					LocustHealthActivity.this.cbLeftInField.setChecked(true);
				if (str.indexOf("5") != -1)
					LocustHealthActivity.this.cbBuried.setChecked(true);
				if (str.indexOf("6") != -1)
					LocustHealthActivity.this.cbBurned.setChecked(true);
			}
		});
		cbTripleRinsed = (CheckBox) findViewById(R.id.cbTripleRinsed);
		cbPunctured = (CheckBox) findViewById(R.id.cbPunctured);
		cbTakenBackToBase = (CheckBox) findViewById(R.id.cbTakenBackToBase);
		cbLeftInField = (CheckBox) findViewById(R.id.cbLeftInField);
		cbBuried = (CheckBox) findViewById(R.id.cbBuried);
		cbBurned = (CheckBox) findViewById(R.id.cbBurned);

		//H Наблюдалось или сообщалось о случайном загрязнении? (например, разлив инсектицидов, неправильная очистка оборудования и т. д.)
		spiSafObservedPollution = findViewById(R.id.spiSafObservedPollution);
		guiTableHealth.add(spiSafObservedPollution, "safety_observed_pollution");
		((selectDB)spiSafObservedPollution).addField("", "");
		((selectDB)spiSafObservedPollution).addField(getString(R.string.Yes), "1");
		((selectDB)spiSafObservedPollution).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSafObservedPollution).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSafTypePollution = findViewById(R.id.llSafTypePollution);
				if(((selectDB)spiSafObservedPollution).getValue() != null && ((selectDB)spiSafObservedPollution).getValue().equals("1")) {
					llSafTypePollution.setVisibility(View.VISIBLE);
				}else{
					edtSafTypePollution.setText("");
					llSafTypePollution.setVisibility(View.GONE);
				}
			}
		});

		//H Если Да, то где и какой тип загрязнения?
		edtSafTypePollution = (EditText) findViewById(R.id.edtSafTypePollution);
		guiTableHealth.add(edtSafTypePollution, "safety_type_pollution");

		// воздействие на нецелевые организмы
		spiSafNonTarget = findViewById(R.id.spiSafNonTarget);
		guiTableDel.add(spiSafNonTarget, "safety_non_target");
		((selectDB)spiSafNonTarget).addField("", "");
		((selectDB)spiSafNonTarget).addField(getString(R.string.Yes), "1");
		((selectDB)spiSafNonTarget).addField(getString(R.string.No), "0");

		// если да, то какое воздействие на нецелевые организмы
		edtSafNonTargetEffect = (EditText) findViewById(R.id.edtSafNonTargetEffect);
		guiTableDel.add(edtSafNonTargetEffect, "safety_non_target_effect");

		//H Наблюдалось или сообщалось о воздействии на нецелевые организмы? (например, болезни домашнего скота, смертность рыб, гибель пчел и т.д.)
		spiSafNonTarget2 = findViewById(R.id.spiSafNonTarget2);
		guiTableHealth.add(spiSafNonTarget2, "safety_non_target");
		((selectDB)spiSafNonTarget2).addField("", "");
		((selectDB)spiSafNonTarget2).addField(getString(R.string.Yes), "1");
		((selectDB)spiSafNonTarget2).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSafNonTarget2).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSafNonTargetEffect2 = findViewById(R.id.llSafNonTargetEffect2);
				LinearLayout llSafNonTargetEffectPerson = findViewById(R.id.llSafNonTargetEffectPerson);
				if(((selectDB)spiSafNonTarget2).getValue() != null && ((selectDB)spiSafNonTarget2).getValue().equals("1")) {
					llSafNonTargetEffect2.setVisibility(View.VISIBLE);
					llSafNonTargetEffectPerson.setVisibility(View.VISIBLE);
				}else{
					edtSafNonTargetEffect2.setText("");
					edtSafNonTargetEffectPerson.setText("");
					llSafNonTargetEffect2.setVisibility(View.GONE);
					llSafNonTargetEffectPerson.setVisibility(View.GONE);
				}
			}
		});

		//H Если Да, то где и какое воздействие?
		edtSafNonTargetEffect2 = (EditText) findViewById(R.id.edtSafNonTargetEffect2);
		guiTableHealth.add(edtSafNonTargetEffect2, "safety_non_target_effect");
		//H Если информация поступила от прочих лиц, от кого именно? (укажите имя, номер телефона, адрес)
		edtSafNonTargetEffectPerson = (EditText) findViewById(R.id.edtSafNonTargetEffectPerson);
		guiTableHealth.add(edtSafNonTargetEffectPerson, "safety_non_target_effect_person");
		if(findViewById(R.id.btnSafNonTargetEffectPerson)!=null) {
			findViewById(R.id.btnSafNonTargetEffectPerson).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.If_reported_by_another_person_by_whom));
				}
			});
		}

		// Другие инциденты по здоровью или окружающей среде, возникшие возможно при обработке
		spiSafIncident = findViewById(R.id.spiSafIncident);
		guiTableDel.add(spiSafIncident, "safety_incident");
		((selectDB)spiSafIncident).addField("", "");
		((selectDB)spiSafIncident).addField(getString(R.string.Yes), "1");
		((selectDB)spiSafIncident).addField(getString(R.string.No), "0");

		// Если Да, тип инцидента и кем сообщен (описание)
		edtSafIncidentEffect = (EditText) findViewById(R.id.edtSafIncidentEffect);
		guiTableDel.add(edtSafIncidentEffect, "safety_incident_effect");

		//H Осуществлялся ли бригадой по мониторингу ЗЧ и ОС контроль в отношении наблюдаемого или зарегистрированного воздействия на окружающую среду
		spiSafControl = findViewById(R.id.spiSafControl);
		guiTableHealth.add(spiSafControl, "safety_control");
		((selectDB)spiSafControl).addField("", "");
		((selectDB)spiSafControl).addField(getString(R.string.Yes), "1");
		((selectDB)spiSafControl).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiSafControl).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llSafControlActions = findViewById(R.id.llSafControlActions);
				if(((selectDB)spiSafControl).getValue() != null && ((selectDB)spiSafControl).getValue().equals("1")) {
					llSafControlActions.setVisibility(View.VISIBLE);
				}else{
					edtSafControlActions.setText("");
					llSafControlActions.setVisibility(View.GONE);
				}
			}
		});

		//H Если Да, опишите последующее действие(я)
		edtSafControlActions = (EditText) findViewById(R.id.edtSafControlActions);
		guiTableHealth.add(edtSafControlActions, "safety_control_actions");

		//********** Предоставление информации *********
		edtComments = (EditText) findViewById(R.id.edtComments); // КОММЕНТАР�?�?
		guiTableDel.add(edtComments, "comments");

		//********** Карта и фотографии **********
		//H Была ли составлена ситуационная карта обработки?
		spiMapTreatment = findViewById(R.id.spiMapTreatment);
		guiTableHealth.add(spiMapTreatment, "map_treatment");
		((selectDB)spiMapTreatment).addField("", "");
		((selectDB)spiMapTreatment).addField(getString(R.string.Yes), "1");
		((selectDB)spiMapTreatment).addField(getString(R.string.No), "0");
		//H Фото ситуации, возникшей при обработке, любых инцидентов и т. д.
		edtImage1 = (EditText) findViewById(R.id.edtImage1); // Фото
		guiTableHealth.add(edtImage1, "image_name1");
		edtImage2 = (EditText) findViewById(R.id.edtImage2); // Фото
		guiTableHealth.add(edtImage2, "image_name2");
		edtImage3 = (EditText) findViewById(R.id.edtImage3); // Фото
		guiTableHealth.add(edtImage3, "image_name3");
		edtImage4 = (EditText) findViewById(R.id.edtImage4); // Фото
		guiTableHealth.add(edtImage4, "image_name4");
		edtImage5 = (EditText) findViewById(R.id.edtImage5); // Фото
		guiTableHealth.add(edtImage5, "image_name5");

		//********** Оценки риска **********
		//H Имеются ли в непосредственной близости от обработок жилые дома или жилье (в радиусе 2 км вокруг обрабатываемого участка)
		spiRiskHouse = findViewById(R.id.spiRiskHouse);
		guiTableHealth.add(spiRiskHouse, "risk_house");
		((selectDB)spiRiskHouse).addField("", "");
		((selectDB)spiRiskHouse).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskHouse).addField(getString(R.string.No), "0");
		if(findViewById(R.id.btnRiskHouse)!=null) {
			findViewById(R.id.btnRiskHouse).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Any_dwellings_or_housing_nearby_the_treatment));
				}
			});
		}
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskHouse).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskHouseDistance = findViewById(R.id.llRiskHouseDistance);
				LinearLayout llRiskHouseBufferZones  = findViewById(R.id.llRiskHouseBufferZones);
				LinearLayout llRiskHouseImpact = findViewById(R.id.llRiskHouseImpact);
				LinearLayout llRiskHouseInformed = findViewById(R.id.llRiskHouseInformed);
				if(((selectDB)spiRiskHouse).getValue() != null && ((selectDB)spiRiskHouse).getValue().equals("1")) {
					llRiskHouseDistance.setVisibility(View.VISIBLE);
					llRiskHouseBufferZones.setVisibility(View.VISIBLE);
					llRiskHouseImpact.setVisibility(View.VISIBLE);
					llRiskHouseInformed.setVisibility(View.VISIBLE);
				}else{
					edtRiskHouseDistance.setText("");
					((selectDB)spiRiskHouseBufferZones).setValue(null);
					((selectDB)spiRiskHouseImpact).setValue(null);
					((selectDB)spiRiskHouseInformed).setValue(null);
					llRiskHouseDistance.setVisibility(View.GONE);
					llRiskHouseBufferZones.setVisibility(View.GONE);
					llRiskHouseImpact.setVisibility(View.GONE);
					llRiskHouseInformed.setVisibility(View.GONE);
				}
			}
		});
		//H Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего жилья:
		edtRiskHouseDistance = (EditText) findViewById(R.id.edtRiskHouseDistance);
		guiTableHealth.add(edtRiskHouseDistance, "risk_house_distance");
		//H Соблюдались ли буферные зоны?
		spiRiskHouseBufferZones = findViewById(R.id.spiRiskHouseBufferZones);
		guiTableHealth.add(spiRiskHouseBufferZones, "risk_house_buffer_zones");
		((selectDB)spiRiskHouseBufferZones).addField("", "");
		((selectDB)spiRiskHouseBufferZones).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskHouseBufferZones).addField(getString(R.string.No), "0");
		//H Существует ли вероятность воздействия на жилые дома/жилье?
		spiRiskHouseImpact = findViewById(R.id.spiRiskHouseImpact);
		guiTableHealth.add(spiRiskHouseImpact, "risk_house_impact");
		((selectDB)spiRiskHouseImpact).addField("", "");
		((selectDB)spiRiskHouseImpact).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskHouseImpact).addField(getString(R.string.No), "0");
		//H Были ли проинформированы жители о применении инсектицидов? (проверка бригадой по мониторингу)
		spiRiskHouseInformed = findViewById(R.id.spiRiskHouseInformed);
		guiTableHealth.add(spiRiskHouseInformed, "risk_house_informed");
		((selectDB)spiRiskHouseInformed).addField("", "");
		((selectDB)spiRiskHouseInformed).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskHouseInformed).addField(getString(R.string.No), "0");

		//H Имеются ли в непосредственной близости от обработок поверхностные воды (в радиусе 2 км вокруг обрабатываемого участка)
		spiRiskWater = findViewById(R.id.spiRiskWater);
		guiTableHealth.add(spiRiskWater, "risk_water");
		((selectDB)spiRiskWater).addField("", "");
		((selectDB)spiRiskWater).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskWater).addField(getString(R.string.No), "0");
		if(findViewById(R.id.btnRiskWater)!=null) {
			findViewById(R.id.btnRiskWater).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Any_surface_waters_nearby_the_treatment));
				}
			});
		}
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskWater).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskWaterDistance = findViewById(R.id.llRiskWaterDistance);
				LinearLayout llRiskWaterBufferZones  = findViewById(R.id.llRiskWaterBufferZones);
				LinearLayout llRiskWaterImpact = findViewById(R.id.llRiskWaterImpact);
				if(((selectDB)spiRiskWater).getValue() != null && ((selectDB)spiRiskWater).getValue().equals("1")) {
					llRiskWaterDistance.setVisibility(View.VISIBLE);
					llRiskWaterBufferZones.setVisibility(View.VISIBLE);
					llRiskWaterImpact.setVisibility(View.VISIBLE);
				}else{
					edtRiskWaterDistance.setText("");
					((selectDB)spiRiskWaterBufferZones).setValue(null);
					((selectDB)spiRiskWaterImpact).setValue(null);
					llRiskWaterDistance.setVisibility(View.GONE);
					llRiskWaterBufferZones.setVisibility(View.GONE);
					llRiskWaterImpact.setVisibility(View.GONE);
				}
			}
		});
		//H Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего источника поверхностной воды:
		edtRiskWaterDistance = (EditText) findViewById(R.id.edtRiskWaterDistance);
		guiTableHealth.add(edtRiskWaterDistance, "risk_water_distance");
		//H Соблюдались ли буферные зоны?
		spiRiskWaterBufferZones = findViewById(R.id.spiRiskWaterBufferZones);
		guiTableHealth.add(spiRiskWaterBufferZones, "risk_water_buffer_zones");
		((selectDB)spiRiskWaterBufferZones).addField("", "");
		((selectDB)spiRiskWaterBufferZones).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskWaterBufferZones).addField(getString(R.string.No), "0");
		//H Существует ли вероятность воздействия на поверхностные воды?
		spiRiskWaterImpact = findViewById(R.id.spiRiskWaterImpact);
		guiTableHealth.add(spiRiskWaterImpact, "risk_water_impact");
		((selectDB)spiRiskWaterImpact).addField("", "");
		((selectDB)spiRiskWaterImpact).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskWaterImpact).addField(getString(R.string.No), "0");

		//H Имеются ли в непосредственной близости от обработок пчеловодства (в радиусе 5 км вокруг обрабатываемого участка)
		spiRiskApiary = findViewById(R.id.spiRiskApiary);
		guiTableHealth.add(spiRiskApiary, "risk_apiary");
		((selectDB)spiRiskApiary).addField("", "");
		((selectDB)spiRiskApiary).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskApiary).addField(getString(R.string.No), "0");
		if(findViewById(R.id.btnRiskApiary)!=null) {
			findViewById(R.id.btnRiskApiary).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Any_apiculture_nearby_the_treatment));
				}
			});
		}
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskApiary).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskApiaryDistance = findViewById(R.id.llRiskApiaryDistance);
				LinearLayout llRiskApiaryInformed  = findViewById(R.id.llRiskApiaryInformed);
				LinearLayout llRiskApiaryMeasure = findViewById(R.id.llRiskApiaryMeasure);
				LinearLayout llRiskApiaryImpact = findViewById(R.id.llRiskApiaryImpact);
				if(((selectDB)spiRiskApiary).getValue() != null && ((selectDB)spiRiskApiary).getValue().equals("1")) {
					llRiskApiaryDistance.setVisibility(View.VISIBLE);
					llRiskApiaryInformed.setVisibility(View.VISIBLE);
					llRiskApiaryMeasure.setVisibility(View.VISIBLE);
					llRiskApiaryImpact.setVisibility(View.VISIBLE);
				}else{
					edtRiskApiaryDistance.setText("");
					((selectDB)spiRiskApiaryInformed).setValue(null);
					edtRiskApiaryMeasure.setText("");
					((selectDB)spiRiskAgriculturalInform).setValue(null);
					llRiskApiaryDistance.setVisibility(View.GONE);
					llRiskApiaryInformed.setVisibility(View.GONE);
					llRiskApiaryMeasure.setVisibility(View.GONE);
					llRiskApiaryImpact.setVisibility(View.GONE);
				}
			}
		});
		//H Расстояние от ближайшего края обрабатываемого участка (м) до пасеки
		edtRiskApiaryDistance = (EditText) findViewById(R.id.edtRiskApiaryDistance);
		guiTableHealth.add(edtRiskApiaryDistance, "risk_apiary_distance");
		//H Были ли пчеловоды проинформированы о применении инсектицидов
		spiRiskApiaryInformed = findViewById(R.id.spiRiskApiaryInformed);
		guiTableHealth.add(spiRiskApiaryInformed, "risk_apiary_informed");
		((selectDB)spiRiskApiaryInformed).addField("", "");
		((selectDB)spiRiskApiaryInformed).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskApiaryInformed).addField(getString(R.string.No), "0");
		//H Какие меры были предприняты для снижения отрицательного воздействия на пчел
		edtRiskApiaryMeasure = (EditText) findViewById(R.id.edtRiskApiaryMeasure);
		guiTableHealth.add(edtRiskApiaryMeasure, "risk_apiary_measure");
		//H Существует ли вероятность воздействия на пчел
		spiRiskApiaryImpact = findViewById(R.id.spiRiskApiaryImpact);
		guiTableHealth.add(spiRiskApiaryImpact, "risk_apiary_impact");
		((selectDB)spiRiskApiaryImpact).addField("", "");
		((selectDB)spiRiskApiaryImpact).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskApiaryImpact).addField(getString(R.string.No), "0");

		//H Были ли обработаны или подверглись воздействию какие-либо сельхозкультуры?
		spiRiskAgricultural = findViewById(R.id.spiRiskAgricultural);
		guiTableHealth.add(spiRiskAgricultural, "risk_agricultural");
		((selectDB)spiRiskAgricultural).addField("", "");
		((selectDB)spiRiskAgricultural).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskAgricultural).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskAgricultural).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskAgriculturalName = findViewById(R.id.llRiskAgriculturalName);
				LinearLayout llRiskAgriculturalPhase  = findViewById(R.id.llRiskAgriculturalPhase);
				LinearLayout llRiskAgriculturalToxic = findViewById(R.id.llRiskAgriculturalToxic);
				LinearLayout llRiskAgriculturalInform = findViewById(R.id.llRiskAgriculturalInform);
				if(((selectDB)spiRiskAgricultural).getValue() != null && ((selectDB)spiRiskAgricultural).getValue().equals("1")) {
					llRiskAgriculturalName.setVisibility(View.VISIBLE);
					llRiskAgriculturalPhase.setVisibility(View.VISIBLE);
					llRiskAgriculturalToxic.setVisibility(View.VISIBLE);
					llRiskAgriculturalInform.setVisibility(View.VISIBLE);
				}else{
					edtRiskAgriculturalName.setText("");
					edtRiskAgriculturalPhase.setText("");
					((selectDB)spiRiskAgriculturalToxic).setValue(null);
					((selectDB)spiRiskAgriculturalInform).setValue(null);
					llRiskAgriculturalName.setVisibility(View.GONE);
					llRiskAgriculturalPhase.setVisibility(View.GONE);
					llRiskAgriculturalToxic.setVisibility(View.GONE);
					llRiskAgriculturalInform.setVisibility(View.GONE);
				}
			}
		});
		//H Наименование сельхозкультуры
		edtRiskAgriculturalName = (EditText) findViewById(R.id.edtRiskAgriculturalName);
		guiTableHealth.add(edtRiskAgriculturalName, "risk_agricultural_name");
		//H Фаза развития сельхозкультуры
		edtRiskAgriculturalPhase = (EditText) findViewById(R.id.edtRiskAgriculturalPhase);
		guiTableHealth.add(edtRiskAgriculturalPhase, "risk_agricultural_phase");
		//H Наблюдалась ли фитотоксичность
		spiRiskAgriculturalToxic = findViewById(R.id.spiRiskAgriculturalToxic);
		guiTableHealth.add(spiRiskAgriculturalToxic, "risk_agricultural_toxic");
		((selectDB)spiRiskAgriculturalToxic).addField("", "");
		((selectDB)spiRiskAgriculturalToxic).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskAgriculturalToxic).addField(getString(R.string.No), "0");
		//H Были ли фермеры проинформированы о предуборочном периоде
		spiRiskAgriculturalInform = findViewById(R.id.spiRiskAgriculturalInform);
		guiTableHealth.add(spiRiskAgriculturalInform, "risk_agricultural_inform");
		((selectDB)spiRiskAgriculturalInform).addField("", "");
		((selectDB)spiRiskAgriculturalInform).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskAgriculturalInform).addField(getString(R.string.No), "0");

		//H Имеются ли в непосредственной близости от обработок шелководства (в радиусе 2 км вокруг обрабатываемого участка)
		spiRiskSilk = findViewById(R.id.spiRiskSilk);
		guiTableHealth.add(spiRiskSilk, "risk_silk");
		((selectDB)spiRiskSilk).addField("", "");
		((selectDB)spiRiskSilk).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskSilk).addField(getString(R.string.No), "0");

		if(findViewById(R.id.btnRiskSilk)!=null) {
			findViewById(R.id.btnRiskSilk).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Any_sericulture_nearby_the_treatment));
				}
			});
		}

		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskSilk).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskSilkDistance = findViewById(R.id.llRiskSilkDistance);
				LinearLayout llRiskSilkInform  = findViewById(R.id.llRiskSilkInform);
				LinearLayout llRiskSilkTreesMeasure = findViewById(R.id.llRiskSilkTreesMeasure);
				LinearLayout llRiskSilkTreesImpact = findViewById(R.id.llRiskSilkTreesImpact);
				if(((selectDB)spiRiskSilk).getValue() != null && ((selectDB)spiRiskSilk).getValue().equals("1")) {
					llRiskSilkDistance.setVisibility(View.VISIBLE);
					llRiskSilkInform.setVisibility(View.VISIBLE);
					llRiskSilkTreesMeasure.setVisibility(View.VISIBLE);
					llRiskSilkTreesImpact.setVisibility(View.VISIBLE);
				}else{
					edtRiskSilkDistance.setText("");
					((selectDB)spiRiskSilkInform).setValue(null);
					edtRiskSilkTreesMeasure.setText("");
					((selectDB)spiRiskSilkTreesImpact).setValue(null);
					llRiskSilkDistance.setVisibility(View.GONE);
					llRiskSilkInform.setVisibility(View.GONE);
					llRiskSilkTreesMeasure.setVisibility(View.GONE);
					llRiskSilkTreesImpact.setVisibility(View.GONE);
				}
			}
		});
		//H Расстояние от ближайшего края обрабатываемого участка (м) до тутовой плантации
		edtRiskSilkDistance = (EditText) findViewById(R.id.edtRiskSilkDistance);
		guiTableHealth.add(edtRiskSilkDistance, "risk_silk_distance");
		//H Были ли шелководы проинформированы о применении инсектицидов?
		spiRiskSilkInform = findViewById(R.id.spiRiskSilkInform);
		guiTableHealth.add(spiRiskSilkInform, "risk_silk_inform");
		((selectDB)spiRiskSilkInform).addField("", "");
		((selectDB)spiRiskSilkInform).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskSilkInform).addField(getString(R.string.No), "0");
		//H Какие меры были предприняты для снижения отрицательного воздействия на тутовые деревья
		edtRiskSilkTreesMeasure = (EditText) findViewById(R.id.edtRiskSilkTreesMeasure);
		guiTableHealth.add(edtRiskSilkTreesMeasure, "risk_silk_trees_measure");
		//H Существует ли вероятность воздействия на тутовые деревья
		spiRiskSilkTreesImpact = findViewById(R.id.spiRiskSilkTreesImpact);
		guiTableHealth.add(spiRiskSilkTreesImpact, "risk_silk_trees_impact");
		((selectDB)spiRiskSilkTreesImpact).addField("", "");
		((selectDB)spiRiskSilkTreesImpact).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskSilkTreesImpact).addField(getString(R.string.No), "0");


		//H Были ли обработаны луга или пастбища?
		spiRiskPastures = findViewById(R.id.spiRiskPastures);
		guiTableHealth.add(spiRiskPastures, "risk_pastures");
		((selectDB)spiRiskPastures).addField("", "");
		((selectDB)spiRiskPastures).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskPastures).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskPastures).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskPasturesInform = findViewById(R.id.llRiskPasturesInform);
				if(((selectDB)spiRiskPastures).getValue() != null && ((selectDB)spiRiskPastures).getValue().equals("1")) {
					llRiskPasturesInform.setVisibility(View.VISIBLE);
				}else{
					((selectDB)spiRiskPasturesInform).setValue(null);
					llRiskPasturesInform.setVisibility(View.GONE);
				}
			}
		});
		//H Были ли пастухи проинформированы о периодах удержания домашнего скота?
		spiRiskPasturesInform = findViewById(R.id.spiRiskPasturesInform);
		guiTableHealth.add(spiRiskPasturesInform, "risk_pastures_inform");
		((selectDB)spiRiskPasturesInform).addField("", "");
		((selectDB)spiRiskPasturesInform).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskPasturesInform).addField(getString(R.string.No), "0");

		//H Имеются ли в непосредственной близости от обработок другие экологически чувствительные зоны (например, национальный парк, заповедник) (в радиусе 2 км вокруг обрабатываемого участка)
		spiRiskPark = findViewById(R.id.spiRiskPark);
		guiTableHealth.add(spiRiskPark, "risk_park");
		((selectDB)spiRiskPark).addField("", "");
		((selectDB)spiRiskPark).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskPark).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskPark).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskParkType = findViewById(R.id.llRiskParkType);
				LinearLayout llRiskParkDistance = findViewById(R.id.llRiskParkDistance);
				LinearLayout llRiskParkBufferZones = findViewById(R.id.llRiskParkBufferZones);
				LinearLayout llRiskParkImpact = findViewById(R.id.llRiskParkImpact);
				if(((selectDB)spiRiskPark).getValue() != null && ((selectDB)spiRiskPark).getValue().equals("1")) {
					llRiskParkType.setVisibility(View.VISIBLE);
					llRiskParkDistance.setVisibility(View.VISIBLE);
					llRiskParkBufferZones.setVisibility(View.VISIBLE);
					llRiskParkImpact.setVisibility(View.VISIBLE);
				}else{
					edtRiskParkType.setText("");
					edtRiskParkDistance.setText("");
					((selectDB)spiRiskParkBufferZones).setValue(null);
					((selectDB)spiRiskParkImpact).setValue(null);

					llRiskParkType.setVisibility(View.GONE);
					llRiskParkDistance.setVisibility(View.GONE);
					llRiskParkBufferZones.setVisibility(View.GONE);
					llRiskParkImpact.setVisibility(View.GONE);
				}
			}
		});
		if(findViewById(R.id.btnRiskPark)!=null) {
			findViewById(R.id.btnRiskPark).setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					alert(getString(R.string.Information),getString(R.string.Any_other_ecologically_sensitive_areas_nearby_the_treatment));
				}
			});
		}

		//H Какой тип экологически чувствительной зоны
		edtRiskParkType = (EditText) findViewById(R.id.edtRiskParkType);
		guiTableHealth.add(edtRiskParkType, "risk_park_type");
		//H Расстояние от ближайшего края обрабатываемого участка (м) до экологически чувствительной зоны
		edtRiskParkDistance = (EditText) findViewById(R.id.edtRiskParkDistance);
		guiTableHealth.add(edtRiskParkDistance, "risk_park_distance");
		//H Соблюдались ли буферные зоны?
		spiRiskParkBufferZones = findViewById(R.id.spiRiskParkBufferZones);
		guiTableHealth.add(spiRiskParkBufferZones, "risk_park_buffer_zones");
		((selectDB)spiRiskParkBufferZones).addField("", "");
		((selectDB)spiRiskParkBufferZones).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskParkBufferZones).addField(getString(R.string.No), "0");
		//H Существует ли вероятность воздействия на экологически чувствительные зоны?
		spiRiskParkImpact = findViewById(R.id.spiRiskParkImpact);
		guiTableHealth.add(spiRiskParkImpact, "risk_park_impact");
		((selectDB)spiRiskParkImpact).addField("", "");
		((selectDB)spiRiskParkImpact).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskParkImpact).addField(getString(R.string.No), "0");

		//********** Отбор проб для анализа остатков **********
		//H Пробы, взятые для анализа остатков
		spiRiskProbeAnalysis = findViewById(R.id.spiRiskProbeAnalysis);
		guiTableHealth.add(spiRiskProbeAnalysis, "risk_probe_analysis");
		((selectDB)spiRiskProbeAnalysis).addField("", "");
		((selectDB)spiRiskProbeAnalysis).addField(getString(R.string.Yes), "1");
		((selectDB)spiRiskProbeAnalysis).addField(getString(R.string.No), "0");
		// Чтоб при изменении значения скрывались соответствующие поля
		((selectDB)spiRiskProbeAnalysis).setOnChangeValueListener(new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				LinearLayout llRiskProbeAnalysisName = findViewById(R.id.llRiskProbeAnalysisName);
				LinearLayout llRiskProbeAnalysisNumber = findViewById(R.id.llRiskProbeAnalysisNumber);
				if(((selectDB)spiRiskProbeAnalysis).getValue() != null && ((selectDB)spiRiskProbeAnalysis).getValue().equals("1")) {
					llRiskProbeAnalysisName.setVisibility(View.VISIBLE);
					llRiskProbeAnalysisNumber.setVisibility(View.VISIBLE);
				}else{
					edtRiskProbeAnalysisName.setText("");
					edtRiskProbeAnalysisNumber.setText("");
					llRiskProbeAnalysisName.setVisibility(View.GONE);
					llRiskProbeAnalysisNumber.setVisibility(View.GONE);
				}
			}
		});
		//H Проба какого субстрата или организма была взята
		edtRiskProbeAnalysisName = (EditText) findViewById(R.id.edtRiskProbeAnalysisName);
		guiTableHealth.add(edtRiskProbeAnalysisName, "risk_probe_analysis_name");
		//H Регистрационный номер формы отбора проб
		edtRiskProbeAnalysisNumber = (EditText) findViewById(R.id.edtRiskProbeAnalysisNumber);
		guiTableHealth.add(edtRiskProbeAnalysisNumber, "risk_probe_analysis_number");

		Integer user_id = null;
		/*DbOpenHelper dboh = new DbOpenHelper(this);
		SQLiteDatabase db = dboh.getReadableDatabase();
		Cursor cursor = db.rawQuery("select id from _user where del=0;", null);
		if (cursor.moveToFirst())
		{
			user_id = Integer.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
		}
		cursor.close();
		dboh.close();*/
		guiTableHealth.add(user_id, "user_id"); //Пользователя больше нет!!!
		String device_id= Secure.getString(getContentResolver(), Secure.ANDROID_ID);
		guiTableHealth.add(device_id, "device_id"); //Идентификатор устройства

		List<String> list;
		ArrayAdapter<String> dataAdapter;

		scrollView1 = (ScrollView) findViewById(R.id.scrollView1);

		guiTableHealth.add(m_Filled, "filled");


		cbTest = (CheckBox) findViewById(R.id.cbTest);
		guiTableHealth.add(cbTest, "test");


		// *** Кнопки ***
		btnGetGPSCenter2 = (View) findViewById(R.id.btnGetGPSCenter2);
		OnClickListener oclBtnGetGPSCenter2 = new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				DecimalFormatSymbols custom = new DecimalFormatSymbols(new Locale("en", "US"));
				custom.setDecimalSeparator('.');

				DecimalFormat df = new DecimalFormat("0.0000000");
				df.setDecimalFormatSymbols(custom);

				if(LocustHealthActivity.this._lat!=0 && LocustHealthActivity.this._lon!=0) {
					LocustHealthActivity.this.edtLatCenter2.setText(df.format(LocustHealthActivity.this._lat));
					LocustHealthActivity.this.edtLonCenter2.setText(df.format(LocustHealthActivity.this._lon));
				}
				//Checking if the GPS is active and if it is inactive, I display a warning about it
				LocationManager locationManager = (LocationManager) LocustHealthActivity.this.getSystemService(Context.LOCATION_SERVICE);;
				if(!locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)){
					Toast.makeText(LocustHealthActivity.this, LocustHealthActivity.this.getResources().getString(R.string.Please_activate_GPS), Toast.LENGTH_LONG).show();
				}
			}
		};
		btnGetGPSCenter2.setOnClickListener(oclBtnGetGPSCenter2);

		btnDelGPSCenter2 = (View) findViewById(R.id.btnDelGPSCenter2);
		btnDelGPSCenter2.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				LocustHealthActivity.this.edtLatCenter2.setText("");
				LocustHealthActivity.this.edtLonCenter2.setText("");
			}
		});

		btnOnMap = (View) findViewById(R.id.btnOnMap);
		OnClickListener oclBtnOnMap = new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				Intent intent = new Intent(LocustHealthActivity.this, MapsActivity.class);
				intent.putParcelableArrayListExtra("LatLon", ((LatLonAdapter)latlonList.getAdapter()).latlonList);
				intent.putExtra("uid", frmlocustdel_uid);
				startActivityForResult(intent,10);
			}
		};
		btnOnMap.setOnClickListener(oclBtnOnMap);


		btnOk = (View) findViewById(R.id.btnOk);
		OnClickListener oclBtnOk = new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				saveData();
			}
		};
		btnOk.setOnClickListener(oclBtnOk);

		btnCancel = (View) findViewById(R.id.btnCancel);
		OnClickListener oclBtnCancel = new OnClickListener()
		{
			@Override
			public void onClick(View v)
			{
				AlertDialog.Builder adb = new AlertDialog.Builder(LocustHealthActivity.this, R.style.AlertDialogTheme);
				adb.setTitle(getString(R.string.Warning));
				adb.setMessage(LocustHealthActivity.this.getResources().getString(R.string.Cancel_filling_form));
				adb.setPositiveButton(LocustHealthActivity.this.getResources().getString(R.string.Yes), new DialogInterface.OnClickListener() {
					@Override
					public void onClick(DialogInterface dialog, int id) {
						LocustHealthActivity.this.finish();
					}
				});
				adb.setNegativeButton(LocustHealthActivity.this.getResources().getString(R.string.No), new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int id) {

					}
				});
				AlertDialog ad = adb.show();
				ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK);
				ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK);
			}
		};
		btnCancel.setOnClickListener(oclBtnCancel);

		((View) findViewById(R.id.btnImage1)).setOnClickListener(new OnClickListenerImage(this,1));
		((View) findViewById(R.id.btnImage2)).setOnClickListener(new OnClickListenerImage(this,2));
		((View) findViewById(R.id.btnImage3)).setOnClickListener(new OnClickListenerImage(this,3));
		((View) findViewById(R.id.btnImage4)).setOnClickListener(new OnClickListenerImage(this,4));
		((View) findViewById(R.id.btnImage5)).setOnClickListener(new OnClickListenerImage(this,5));

		((View) findViewById(R.id.btnShowImage1)).setOnClickListener(new OnClickListenerImageShow(this,edtImage1));
		((View) findViewById(R.id.btnShowImage2)).setOnClickListener(new OnClickListenerImageShow(this,edtImage2));
		((View) findViewById(R.id.btnShowImage3)).setOnClickListener(new OnClickListenerImageShow(this,edtImage3));
		((View) findViewById(R.id.btnShowImage4)).setOnClickListener(new OnClickListenerImageShow(this,edtImage4));
		((View) findViewById(R.id.btnShowImage5)).setOnClickListener(new OnClickListenerImageShow(this,edtImage5));

		((View) findViewById(R.id.btnDelImage1)).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ edtImage1.setText(""); } });
		((View) findViewById(R.id.btnDelImage2)).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ edtImage2.setText(""); } });
		((View) findViewById(R.id.btnDelImage3)).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ edtImage3.setText(""); } });
		((View) findViewById(R.id.btnDelImage4)).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ edtImage4.setText(""); } });
		((View) findViewById(R.id.btnDelImage5)).setOnClickListener(new OnClickListener(){ @Override public void onClick(View v){ edtImage5.setText(""); } });

		// Взависимости от параметров создание или редактирование
		editDataDel(frmlocustdel_uid);
		editDataHealth(frmlocusthealth_uid);
		adapter.notifyDataSetChanged();
		Tools.setListViewHeightBasedOnItems(latlonList);

//
//		//updateAlpha(); movied to onResume
//
		// Чтоб слушать GPS (в конце метода чтобы успели присвоиться  GUI компоненты локальным переменным)
		_lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
		if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
			return;
		}
		_lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 1, this);
	}

	@Override
	public void onResume(){
		super.onResume();

		if(spiCountry.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiCountry).updateAdapter(this);
		if(spiRegion.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRegion).updateAdapter(this);
		if(spiVegType.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiVegType).updateAdapter(this);
		if(spiVegCover.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiVegCover).updateAdapter(this);
		if(spiInsFormulation.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiInsFormulation).updateAdapter(this);
		if(spiInsDiluted.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiInsDiluted).updateAdapter(this);
		if(spiInsContainerState.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiInsContainerState).updateAdapter(this);
		if(spiWeaTimeStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWeaTimeStart).updateAdapter(this);
		if(spiWeaTimeEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWeaTimeEnd).updateAdapter(this);
		if(spiWindDirectionStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWindDirectionStart).updateAdapter(this);
		if(spiWindDirectionEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiWindDirectionEnd).updateAdapter(this);
		if(spiSprayDirectionStart.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprayDirectionStart).updateAdapter(this);
		if(spiSprayDirectionEnd.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprayDirectionEnd).updateAdapter(this);
		if(spiLocSpecies.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocSpecies).updateAdapter(this);
		if(spiLocHoppers.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiLocHoppers).updateAdapter(this);
		if(spiMainPurpose.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiMainPurpose).updateAdapter(this);
		if(spiSprPlatform.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatform).updateAdapter(this);
		if(spiSprPlatformA.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformA).updateAdapter(this);
		if(spiSprPlatformG.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformG).updateAdapter(this);
		if(spiSprPlatformH.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprPlatformH).updateAdapter(this);
		if(spiSprLeak.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprLeak).updateAdapter(this);
		if(spiSprDamage.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprDamage).updateAdapter(this);
		if(spiSprBarrier.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprBarrier).updateAdapter(this);
		if(spiSprMarking.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprMarking).updateAdapter(this);
		if(spiSprObservation.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSprObservation).updateAdapter(this);
		if(spiCalibrConsumptionCheck.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiCalibrConsumptionCheck).updateAdapter(this);
		if(spiCalibrPrecipitation.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiCalibrPrecipitation).updateAdapter(this);
		if(spiEffControl.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffControl).updateAdapter(this);
		//if(spiEffTypeImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffTypeImpact).updateAdapter(this);
		if(spiEffMethod.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffMethod).updateAdapter(this);
		if(spiEffControl2.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffControl2).updateAdapter(this);
		//if(spiEffTypeImpact2.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffTypeImpact2).updateAdapter(this);
		if(spiEffMethod2.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiEffMethod2).updateAdapter(this);
		if(spiHlthProtectiveClothingClean.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiHlthProtectiveClothingClean).updateAdapter(this);
		if(spiHlthClothingReserve.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiHlthClothingReserve).updateAdapter(this);
		if(spiHlthInhibition.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiHlthInhibition).updateAdapter(this);
		if(spiOperatorExposedInsecticide.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiOperatorExposedInsecticide).updateAdapter(this);
		if(spiSafObservedPollution.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafObservedPollution).updateAdapter(this);
		if(spiSafNonTarget.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafNonTarget).updateAdapter(this);
		if(spiSafNonTarget2.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafNonTarget2).updateAdapter(this);
		if(spiSafIncident.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafIncident).updateAdapter(this);
		if(spiSafControl.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiSafControl).updateAdapter(this);
		if(spiMapTreatment.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiMapTreatment).updateAdapter(this);
		if(spiRiskHouse.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskHouse).updateAdapter(this);
		if(spiRiskHouseBufferZones.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskHouseBufferZones).updateAdapter(this);
		if(spiRiskHouseImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskHouseImpact).updateAdapter(this);
		if(spiRiskHouseInformed.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskHouseInformed).updateAdapter(this);
		if(spiRiskWater.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskWater).updateAdapter(this);
		if(spiRiskWaterBufferZones.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskWaterBufferZones).updateAdapter(this);
		if(spiRiskWaterImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskWaterImpact).updateAdapter(this);
		if(spiRiskApiary.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskApiary).updateAdapter(this);
		if(spiRiskApiaryInformed.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskApiaryInformed).updateAdapter(this);
		if(spiRiskApiaryImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskApiaryImpact).updateAdapter(this);
		if(spiRiskAgricultural.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskAgricultural).updateAdapter(this);
		if(spiRiskAgriculturalToxic.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskAgriculturalToxic).updateAdapter(this);
		if(spiRiskAgriculturalInform.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskAgriculturalInform).updateAdapter(this);
		if(spiRiskSilk.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskSilk).updateAdapter(this);
		if(spiRiskSilkInform.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskSilkInform).updateAdapter(this);
		if(spiRiskSilkTreesImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskSilkTreesImpact).updateAdapter(this);
		if(spiRiskPastures.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskPastures).updateAdapter(this);
		if(spiRiskPasturesInform.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskPasturesInform).updateAdapter(this);
		if(spiRiskPark.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskPark).updateAdapter(this);
		if(spiRiskParkBufferZones.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskParkBufferZones).updateAdapter(this);
		if(spiRiskParkImpact.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskParkImpact).updateAdapter(this);
		if(spiRiskProbeAnalysis.getClass().toString().indexOf("dbfields.AutoCompleteTextViewDB")!=-1) ((AutoCompleteTextViewDB)spiRiskProbeAnalysis).updateAdapter(this);
		updateAlpha();
	}

	// Сохраняются настройки перед уничтожением формы
	@Override
	protected void onSaveInstanceState(Bundle outState)
	{
		super.onSaveInstanceState(outState);
		//if (mImageUri != null)
		//{
		//	outState.putString("cameraImageUri", mImageUri.toString());
		//}
		// Сохраняем название рисунка (Не знаю почему но автоматом не сохраняет) TODO почему 1 файл а не много и как рабоает в других активити там что кроме первого рисунка при повороте пропадают названия файлов?
		//outState.putString("ImageName", edtImage1.getText().toString());
		//Сохраняю список координат LatLon
		LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter();
		ArrayList<LatLon> list = adapter.latlonList;
		for(int i=0;i<list.size();i++){
			outState.putParcelableArrayList("LatLon", list);
		}
	}

	// Востанавливаются настройки после созания формы
	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState)
	{
		super.onRestoreInstanceState(savedInstanceState);
/*
		if (savedInstanceState.containsKey("cameraImageUri"))
		{
			mImageUri = Uri.parse(savedInstanceState.getString("cameraImageUri"));
			File f = new File("" + mImageUri);
			tmp_ImageName = f.getName();
		}
		edtImage1.setText(savedInstanceState.getString("ImageName")); // Восстанавливаем название рисунка
*/
		//Загружаю список координат LatLon
		LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter();
		adapter.latlonList=savedInstanceState.getParcelableArrayList("LatLon");
		adapter.notifyDataSetChanged();
		Tools.setListViewHeightBasedOnItems(latlonList);
	}

	// Событие нажатия выпадающего меню правый вершний угол
	@Override
	public boolean onOptionsItemSelected(MenuItem item)
	{
		switch (item.getItemId())
		{
			case R.id.action_settings: // Форма настроек

				Intent intent = new Intent(this, SetupActivity.class);
				startActivity(intent);

				break;
			default:
				return false;
		}
		return true;
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data)
	{
		if (requestCode == 1 || requestCode == 2 || requestCode == 3 || requestCode == 4 || requestCode == 5)
		{
			switch (resultCode)
			{
				case 0:
					break;
				case -1:
					//Читаем из локального хранилища название файла
					SharedPreferences preferences = getSharedPreferences("CommonPrefs", Context.MODE_PRIVATE);
					String tmp_ImageName = preferences.getString("IMAGE_NAME", null);

					InputStream file = null;
					try
					{
						//Изменяю разрешение фотографии на 1024 x 768 пикселей
						Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName);
						if(Math.max(bm.getWidth(),bm.getHeight())!=1920)
							bm = Tools.getResizeBMP(bm, 1920); //Изменяем размер фото
						FileOutputStream out = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName);
						bm.compress(Bitmap.CompressFormat.JPEG, 90, out);
						out.flush();
						out.close();

						file = new BufferedInputStream(new FileInputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName));
						CRC32 crc = new CRC32();
						crc.reset();
						int cnt;

						while ((cnt = file.read()) != -1)
						{
							crc.update(cnt);
						}
						// ImageName = Long.toHexString(crc.getValue()) + "_" + ImageName;
						String ImageName = Long.toHexString(crc.getValue()) + "_" + tmp_ImageName;
						file.close();

						// Переименовываем файл
						File renamed = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + tmp_ImageName);
						renamed.renameTo(new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/Locust/" + ImageName));

						if (requestCode == 1)
							edtImage1.setText(ImageName);
						if (requestCode == 2)
							edtImage2.setText(ImageName);
						if (requestCode == 3)
							edtImage3.setText(ImageName);
						if (requestCode == 4)
							edtImage4.setText(ImageName);
						if (requestCode == 5)
							edtImage5.setText(ImageName);

					} catch (IOException e)
					{
						Log.e("CCALM", "Error: ", e);
						//e.printStackTrace();
					}
					// Для сохранения названия рисунка в базу
					break;
			}
		}
		if (requestCode == 10)
		{
			//I removed copying the geozone perimeter because it cannot be done in this questionnaire.
		}
	}

	/*
	 * Задать доступность свойств по поставленным галочкам
	 */
	public void updateAlpha()
	{
		String value;
		//boolean f;
		//int c;

		//H Наблюдалось или сообщалось о случайном загрязнении? (например, разлив инсектицидов, неправильная очистка оборудования и т. д.)
		LinearLayout llSafTypePollution = findViewById(R.id.llSafTypePollution);
		if(((selectDB)spiSafObservedPollution).getValue() != null && ((selectDB)spiSafObservedPollution).getValue().equals("1")) {
			llSafTypePollution.setVisibility(View.VISIBLE);
		}else{
			edtSafTypePollution.setText("");
			llSafTypePollution.setVisibility(View.GONE);
		}

		//H Наблюдалось или сообщалось о воздействии на нецелевые организмы? (например, болезни домашнего скота, смертность рыб, гибель пчел и т.д.)
		LinearLayout llSafNonTargetEffect2 = findViewById(R.id.llSafNonTargetEffect2);
		LinearLayout llSafNonTargetEffectPerson = findViewById(R.id.llSafNonTargetEffectPerson);
		if(((selectDB)spiSafNonTarget2).getValue() != null && ((selectDB)spiSafNonTarget2).getValue().equals("1")) {
			llSafNonTargetEffect2.setVisibility(View.VISIBLE);
			llSafNonTargetEffectPerson.setVisibility(View.VISIBLE);
		}else{
			edtSafNonTargetEffect2.setText("");
			edtSafNonTargetEffectPerson.setText("");
			llSafNonTargetEffect2.setVisibility(View.GONE);
			llSafNonTargetEffectPerson.setVisibility(View.GONE);
		}

		//H Защитная одежда читая и в хорошем состоянии (теперь в этой анкете)
		LinearLayout llHlthClothingState = findViewById(R.id.llHlthClothingState);
		if(((selectDB)spiHlthProtectiveClothingClean).getValue() != null && !((selectDB)spiHlthProtectiveClothingClean).getValue().equals("1")) {
			llHlthClothingState.setVisibility(View.VISIBLE);
		}else{
			edtHlthClothingState.setText("");
			llHlthClothingState.setVisibility(View.GONE);
		}

		//Проведен ли контроль эффективности (бригада мониторинга)?
		LinearLayout llEffTypeImpact2 = findViewById(R.id.llEffTypeImpact2);
		LinearLayout llEffMortality2  = findViewById(R.id.llEffMortality2);
		LinearLayout llEffPassedTime2 = findViewById(R.id.llEffPassedTime2);
		LinearLayout llEffMethod2 = findViewById(R.id.llEffMethod2);
		if(((selectDB)spiEffControl2).getValue() != null && ((selectDB)spiEffControl2).getValue().equals("1")) {
			llEffTypeImpact2.setVisibility(View.VISIBLE);
			llEffMortality2.setVisibility(View.VISIBLE);
			llEffPassedTime2.setVisibility(View.VISIBLE);
			llEffMethod2.setVisibility(View.VISIBLE);
		}else{
			//((selectDB)spiEffTypeImpact2).setValue(null);
			edtEffMortality2.setText("");
			edtEffPassedTime2.setText("");
			((selectDB)spiEffMethod2).setValue(null);
			llEffTypeImpact2.setVisibility(View.GONE);
			llEffMortality2.setVisibility(View.GONE);
			llEffPassedTime2.setVisibility(View.GONE);
			llEffMethod2.setVisibility(View.GONE);
		}

		//Если проводилось наблюдение за опрыскиванием: соблюдалась ли надлежащая практика применения инсектицидов?
		LinearLayout llSprDescription = findViewById(R.id.llSprDescription);
		if(((selectDB)spiSprObservation).getValue() != null && ((selectDB)spiSprObservation).getValue().equals("1")) {
			llSprDescription.setVisibility(View.VISIBLE);
		}else{
			edtSprDescription.setText("");
			llSprDescription.setVisibility(View.GONE);
		}

		//Механическая безопасность: наблюдалась ли утечка инсектицида?
		LinearLayout llSprLeakPlace = findViewById(R.id.llSprLeakPlace);
		if(((selectDB)spiSprLeak).getValue() != null && ((selectDB)spiSprLeak).getValue().equals("1")) {
			llSprLeakPlace.setVisibility(View.VISIBLE);
		}else{
			edtSprLeakPlace.setText("");
			llSprLeakPlace.setVisibility(View.GONE);
		}

		//Система опрыскивания: повреждены распылители или сопла?
		LinearLayout llSprDamagePlace = findViewById(R.id.llSprDamagePlace);
		if(((selectDB)spiSprDamage).getValue() != null && ((selectDB)spiSprDamage).getValue().equals("1")) {
			llSprDamagePlace.setVisibility(View.VISIBLE);
		}else{
			edtSprDamagePlace.setText("");
			llSprDamagePlace.setVisibility(View.GONE);
		}

		//Калибровка расхода жидкости: проверялся ли расход жидкости опрыскивателя во время мониторинга?
		LinearLayout llCalibrTime = findViewById(R.id.llCalibrTime);
		LinearLayout llCalibrVolume  = findViewById(R.id.llCalibrVolume);
		LinearLayout llCalibrRate = findViewById(R.id.llCalibrRate);
		if(((selectDB)spiCalibrConsumptionCheck).getValue() != null && ((selectDB)spiCalibrConsumptionCheck).getValue().equals("1")) {
			llCalibrTime.setVisibility(View.VISIBLE);
			llCalibrVolume.setVisibility(View.VISIBLE);
			llCalibrRate.setVisibility(View.VISIBLE);
		}else{
			edtCalibrTime.setText("");
			edtCalibrVolume.setText("");
			edtCalibrRate.setText("");
			llCalibrTime.setVisibility(View.GONE);
			llCalibrVolume.setVisibility(View.GONE);
			llCalibrRate.setVisibility(View.GONE);
		}
		//Качество применения: проверялось ли осаждение капель во время мониторинга?
		LinearLayout llCalibrWidthCard = findViewById(R.id.llCalibrWidthCard);
		LinearLayout llCalibrWindSpeed  = findViewById(R.id.llCalibrWindSpeed);
		LinearLayout llCalibrDropletCoating = findViewById(R.id.llCalibrDropletCoating);
		LinearLayout llCalibrPassesInterval = findViewById(R.id.llCalibrPassesInterval);
		if(((selectDB)spiCalibrPrecipitation).getValue() != null && ((selectDB)spiCalibrPrecipitation).getValue().equals("1")) {
			llCalibrWidthCard.setVisibility(View.VISIBLE);
			llCalibrWindSpeed.setVisibility(View.VISIBLE);
			llCalibrDropletCoating.setVisibility(View.VISIBLE);
			llCalibrPassesInterval.setVisibility(View.VISIBLE);
		}else{
			edtCalibrWidthCard.setText("");
			edtCalibrWindSpeed.setText("");
			edtCalibrDropletCoating.setText("");
			edtCalibrPassesInterval.setText("");
			llCalibrWidthCard.setVisibility(View.GONE);
			llCalibrWindSpeed.setVisibility(View.GONE);
			llCalibrDropletCoating.setVisibility(View.GONE);
			llCalibrPassesInterval.setVisibility(View.GONE);
		}

		//Осуществлялся ли бригадой по мониторингу ЗЧ и ОС контроль в отношении наблюдаемого или зарегистрированного воздействия на окружающую среду
		LinearLayout llSafControlActions = findViewById(R.id.llSafControlActions);
		if(((selectDB)spiSafControl).getValue() != null && ((selectDB)spiSafControl).getValue().equals("1")) {
			llSafControlActions.setVisibility(View.VISIBLE);
		}else{
			edtSafControlActions.setText("");
			llSafControlActions.setVisibility(View.GONE);
		}

		//Имеются ли в непосредственной близости от обработок жилые дома или жилье (в радиусе 2 км вокруг обрабатываемого участка)
		LinearLayout llRiskHouseDistance = findViewById(R.id.llRiskHouseDistance);
		LinearLayout llRiskHouseBufferZones  = findViewById(R.id.llRiskHouseBufferZones);
		LinearLayout llRiskHouseImpact = findViewById(R.id.llRiskHouseImpact);
		LinearLayout llRiskHouseInformed = findViewById(R.id.llRiskHouseInformed);
		value = ((selectDB)spiRiskHouse).getValue();
		if(value != null && value.equals("1")) {
			llRiskHouseDistance.setVisibility(View.VISIBLE);
			llRiskHouseBufferZones.setVisibility(View.VISIBLE);
			llRiskHouseImpact.setVisibility(View.VISIBLE);
			llRiskHouseInformed.setVisibility(View.VISIBLE);
		}else{
			edtRiskHouseDistance.setText("");
			((selectDB)spiRiskHouseBufferZones).setValue(null);
			((selectDB)spiRiskHouseImpact).setValue(null);
			((selectDB)spiRiskHouseInformed).setValue(null);
			llRiskHouseDistance.setVisibility(View.GONE);
			llRiskHouseBufferZones.setVisibility(View.GONE);
			llRiskHouseImpact.setVisibility(View.GONE);
			llRiskHouseInformed.setVisibility(View.GONE);
		}

		//Имеются ли в непосредственной близости от обработок поверхностные воды (в радиусе 2 км вокруг обрабатываемого участка)
		LinearLayout llRiskWaterDistance = findViewById(R.id.llRiskWaterDistance);
		LinearLayout llRiskWaterBufferZones  = findViewById(R.id.llRiskWaterBufferZones);
		LinearLayout llRiskWaterImpact = findViewById(R.id.llRiskWaterImpact);
		value = ((selectDB)spiRiskWater).getValue();
		if(value != null && value.equals("1")) {
			llRiskWaterDistance.setVisibility(View.VISIBLE);
			llRiskWaterBufferZones.setVisibility(View.VISIBLE);
			llRiskWaterImpact.setVisibility(View.VISIBLE);
		}else{
			edtRiskWaterDistance.setText("");

			((fieldDB)spiRiskWaterBufferZones).setValue(null);
			((fieldDB)spiRiskWaterImpact).setValue(null);

			llRiskWaterDistance.setVisibility(View.GONE);
			llRiskWaterBufferZones.setVisibility(View.GONE);
			llRiskWaterImpact.setVisibility(View.GONE);
		}

		//Имеются ли в непосредственной близости от обработок пчеловодства (в радиусе 5 км вокруг обрабатываемого участка)
		LinearLayout llRiskApiaryDistance = findViewById(R.id.llRiskApiaryDistance);
		LinearLayout llRiskApiaryInformed  = findViewById(R.id.llRiskApiaryInformed);
		LinearLayout llRiskApiaryMeasure = findViewById(R.id.llRiskApiaryMeasure);
		LinearLayout llRiskApiaryImpact = findViewById(R.id.llRiskApiaryImpact);
		value = ((selectDB)spiRiskApiary).getValue();
		if(value != null && value.equals("1")) {
			llRiskApiaryDistance.setVisibility(View.VISIBLE);
			llRiskApiaryInformed.setVisibility(View.VISIBLE);
			llRiskApiaryMeasure.setVisibility(View.VISIBLE);
			llRiskApiaryImpact.setVisibility(View.VISIBLE);
		}else{
			edtRiskApiaryDistance.setText("");
			((selectDB)spiRiskApiaryInformed).setValue(null);
			edtRiskApiaryMeasure.setText("");
			((selectDB)spiRiskAgriculturalInform).setValue(null);
			llRiskApiaryDistance.setVisibility(View.GONE);
			llRiskApiaryInformed.setVisibility(View.GONE);
			llRiskApiaryMeasure.setVisibility(View.GONE);
			llRiskApiaryImpact.setVisibility(View.GONE);
		}

		//Были ли обработаны или подверглись воздействию какие-либо сельхозкультуры?
		LinearLayout llRiskAgriculturalName = findViewById(R.id.llRiskAgriculturalName);
		LinearLayout llRiskAgriculturalPhase  = findViewById(R.id.llRiskAgriculturalPhase);
		LinearLayout llRiskAgriculturalToxic = findViewById(R.id.llRiskAgriculturalToxic);
		LinearLayout llRiskAgriculturalInform = findViewById(R.id.llRiskAgriculturalInform);
		value = ((selectDB)spiRiskAgricultural).getValue();
		if(value != null && value.equals("1")) {
			llRiskAgriculturalName.setVisibility(View.VISIBLE);
			llRiskAgriculturalPhase.setVisibility(View.VISIBLE);
			llRiskAgriculturalToxic.setVisibility(View.VISIBLE);
			llRiskAgriculturalInform.setVisibility(View.VISIBLE);
		}else{
			edtRiskAgriculturalName.setText("");
			edtRiskAgriculturalPhase.setText("");
			((fieldDB)spiRiskAgriculturalToxic).setValue(null);
			((fieldDB)spiRiskAgriculturalInform).setValue(null);
			llRiskAgriculturalName.setVisibility(View.GONE);
			llRiskAgriculturalPhase.setVisibility(View.GONE);
			llRiskAgriculturalToxic.setVisibility(View.GONE);
			llRiskAgriculturalInform.setVisibility(View.GONE);
		}

		//Имеются ли в непосредственной близости от обработок шелководства (в радиусе 2 км вокруг обрабатываемого участка)
		LinearLayout llRiskSilkDistance = findViewById(R.id.llRiskSilkDistance);
		LinearLayout llRiskSilkInform  = findViewById(R.id.llRiskSilkInform);
		LinearLayout llRiskSilkTreesMeasure = findViewById(R.id.llRiskSilkTreesMeasure);
		LinearLayout llRiskSilkTreesImpact = findViewById(R.id.llRiskSilkTreesImpact);
		value = ((selectDB)spiRiskSilk).getValue();
		if(value != null && value.equals("1")) {
			llRiskSilkDistance.setVisibility(View.VISIBLE);
			llRiskSilkInform.setVisibility(View.VISIBLE);
			llRiskSilkTreesMeasure.setVisibility(View.VISIBLE);
			llRiskSilkTreesImpact.setVisibility(View.VISIBLE);
		}else{
			edtRiskSilkDistance.setText("");
			((fieldDB)spiRiskSilkInform).setValue(null);
			edtRiskSilkTreesMeasure.setText("");
			((fieldDB)spiRiskSilkTreesImpact).setValue(null);
			llRiskSilkDistance.setVisibility(View.GONE);
			llRiskSilkInform.setVisibility(View.GONE);
			llRiskSilkTreesMeasure.setVisibility(View.GONE);
			llRiskSilkTreesImpact.setVisibility(View.GONE);
		}

		//H Были ли обработаны луга или пастбища?
		LinearLayout llRiskPasturesInform = findViewById(R.id.llRiskPasturesInform);
		value = ((selectDB)spiRiskPastures).getValue();
		if(value != null && value.equals("1")) {
			llRiskPasturesInform.setVisibility(View.VISIBLE);
		}else{
			((fieldDB)spiRiskPasturesInform).setValue(null);
			llRiskPasturesInform.setVisibility(View.GONE);
		}

		LinearLayout llRiskParkType = findViewById(R.id.llRiskParkType);
		LinearLayout llRiskParkDistance = findViewById(R.id.llRiskParkDistance);
		LinearLayout llRiskParkBufferZones = findViewById(R.id.llRiskParkBufferZones);
		LinearLayout llRiskParkImpact = findViewById(R.id.llRiskParkImpact);
		value = ((selectDB)spiRiskPark).getValue();
		if(value != null && value.equals("1")) {
			llRiskParkType.setVisibility(View.VISIBLE);
			llRiskParkDistance.setVisibility(View.VISIBLE);
			llRiskParkBufferZones.setVisibility(View.VISIBLE);
			llRiskParkImpact.setVisibility(View.VISIBLE);
		}else{
			edtRiskParkType.setText("");
			edtRiskParkDistance.setText("");
			((fieldDB)spiRiskParkBufferZones).setValue(null);
			((fieldDB)spiRiskParkImpact).setValue(null);

			llRiskParkType.setVisibility(View.GONE);
			llRiskParkDistance.setVisibility(View.GONE);
			llRiskParkBufferZones.setVisibility(View.GONE);
			llRiskParkImpact.setVisibility(View.GONE);
		}

		//Пробы, взятые для анализа остатков
		LinearLayout llRiskProbeAnalysisName = findViewById(R.id.llRiskProbeAnalysisName);
		LinearLayout llRiskProbeAnalysisNumber = findViewById(R.id.llRiskProbeAnalysisNumber);
		value = ((selectDB)spiRiskProbeAnalysis).getValue();
		if(value != null && value.equals("1")) {
			llRiskProbeAnalysisName.setVisibility(View.VISIBLE);
			llRiskProbeAnalysisNumber.setVisibility(View.VISIBLE);
		}else{
			edtRiskProbeAnalysisName.setText("");
			edtRiskProbeAnalysisNumber.setText("");
			llRiskProbeAnalysisName.setVisibility(View.GONE);
			llRiskProbeAnalysisNumber.setVisibility(View.GONE);
		}

		/*if (spiEffControl.isChecked())
		{
			f = true;
			c = 0xff000000;

			LinearLayout llEffectiveness = (LinearLayout) findViewById(R.id.llEffectiveness);
			llEffectiveness.setVisibility(View.VISIBLE);
		} else
		{
			edtEffMortality.setText("");
			edtEffTime.setText("");
			((selectDB)spiEffMethod).setValue("");

			f = false;
			c = 0xff888888;
			LinearLayout llEffectiveness = (LinearLayout) findViewById(R.id.llEffectiveness);
			llEffectiveness.setVisibility(View.GONE);
		}*/

		//edtEffMortality.setTextColor(c);
		//edtEffMortality.setFocusable(f);
		//edtEffMortality.setFocusableInTouchMode(f);
		//edtEffMortality.setClickable(f);

		//edtEffTime.setTextColor(c);
		//edtEffTime.setFocusable(f);
		//edtEffTime.setFocusableInTouchMode(f);
		//edtEffTime.setClickable(f);
		// spiSwarmLaying.setTextColor(c);
		//spiEffMethod.setFocusable(f);
		// spiSwarmLaying.setFocusableInTouchMode(f);
		//spiEffMethod.setClickable(f);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu)
	{
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.locust_del, menu);
		return true;
	}

	//Сохраняем список координат в базу
	public void saveLocations(String uid){
		if(uid==null) return;
		DbOpenHelper dboh = new DbOpenHelper(LocustHealthActivity.this);
		SQLiteDatabase wdb = null;
		try {
			wdb = dboh.getWritableDatabase();
			wdb.execSQL("delete from frmlocusthealth_locations where frmlocusthealth_uid=\'" + uid+"\'");
		}finally{
			if(wdb!=null){ wdb.close(); }
		}
		ArrayList<LatLon> list = ((LatLonAdapter)latlonList.getAdapter()).latlonList;
		for(int i=0;i<list.size();i++)
		{
			if(list.get(i)!=null && list.get(i).lon!=0 && list.get(i).lat!=0){
				wdb = null;
				try {
					wdb = dboh.getWritableDatabase();
					SQLiteStatement stmt = wdb.compileStatement("insert into frmlocusthealth_locations(frmlocusthealth_uid,pos,lat,lon)values(?,?,?,?)");
					stmt.bindString(1, uid);
					stmt.bindLong(2, i);
					stmt.bindDouble(3, list.get(i).lat);
					stmt.bindDouble(4, list.get(i).lon);
					stmt.executeInsert();
				}finally{
					if(wdb!=null){ wdb.close(); }
				}
			}
		}
		dboh.close();
	}

	@Override
	public void onLocationChanged(Location location)
	{
		_lat = location.getLatitude(); // от устройства
		_lon = location.getLongitude(); // от устройства
	}

	@Override
	public void onProviderDisabled(String provider)
	{
		// Log.e("CCALM", "provider disabled " + provider);
	}

	@Override
	public void onProviderEnabled(String provider)
	{
		// Log.e("CCALM", "provider enabled " + provider);
	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras)
	{
		// Log.e("CCALM", "status changed to " + provider + " [" + status + "]");
	}

	/**
	 * Чтение данных с формы проивосаранчёвой обработки
	 */
	public void editDataDel(String uid)
	{
		guiTableDel.read(uid);
		//Читаю список координат из базы данных
		if (uid != null)
		{
			LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter();
			ArrayList<LatLon> list = adapter.latlonList;
			list.clear();
			DbOpenHelper dboh = new DbOpenHelper(this);
			SQLiteDatabase rdb = null;
			Cursor cursor = null;
			try {
				rdb = dboh.getWritableDatabase();
				cursor = rdb.rawQuery("select uid,lat,lon from frmlocustdel_locations where frmlocustdel_uid='" + uid + "' order by pos", null);
				if (cursor.moveToFirst())
				{
					do
					{
						list.add(new LatLon(cursor.getString(0), cursor.getDouble(1), cursor.getDouble(2)));
					} while (cursor.moveToNext());
				}
				cursor.close();
			}finally{
				if(cursor!=null){ cursor.close(); }
				if(rdb!=null){ rdb.close(); }
			}
			dboh.close();
			list.add(new LatLon(UUID.randomUUID().toString(),0, 0));
		}
	}

	/**
	 * 	Если id==null то создание иначе редактирование
	 * @param uid
	 */
	public void editDataHealth(String uid){

		//Если это создание то заполняю значениями по умолчанию
		if (uid == null || uid.isBlank())
		{
			((fieldDB)edtMonitoringDate).setValue(String.valueOf((new Date()).getTime()/1000));
			edtMonitoringTimeZone.setText(Tools.getTimezone());
		}
		guiTableHealth.read(uid);
		//Читаю список координат из базы данных
		/*if (uid != null)
		{
			LatLonAdapter adapter = (LatLonAdapter)latlonList.getAdapter();
			ArrayList<LatLon> list = adapter.latlonList;
			list.clear();
			DbOpenHelper dboh = new DbOpenHelper(this);
			Cursor cursor = dboh.getReadableDatabase().rawQuery("select uid,lat,lon from frmlocusthealth_locations where frmlocusthealth_uid='" + uid + "' order by pos", null);
			if (cursor.moveToFirst())
			{
				do
				{
					list.add(new LatLon(cursor.getString(0),cursor.getDouble(1), cursor.getDouble(2)));
				} while (cursor.moveToNext());
			}
			cursor.close();
			dboh.close();
			list.add(new LatLon(UUID.randomUUID().toString(),0, 0));
		}*/
	}

	/***
	 * Переместить и сфокусировать на переданном элементе
	 */
	public void scrollTo(View item)
	{
		int top = 0;
		View tmp = item;
		while (tmp != null)
		{
			if (tmp == scrollView1)
			{
				scrollView1.scrollTo(0, top);
				item.requestFocus();
				break;
			}

			top += tmp.getTop();
			tmp = (View) tmp.getParent();
		}
	}

	public void alert(String title,String text)
	{
		AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme);
		adb.setTitle(title);
		adb.setMessage(text);
		adb.setPositiveButton("OK", new DialogInterface.OnClickListener() // Кнопка открыть
				{
					@Override
					public void onClick(DialogInterface arg0, int arg1)
					{
					}
				});
		AlertDialog ad = adb.show();
		ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK);
	}

	public boolean isGONE(View view)
	{
		if(view==null)
			return false;
		if (!view.isClickable())
			return true;
		try {
			while (view != null) {
				if (view.getVisibility() == View.GONE)
					return true;

				view = (View) view.getParent();
				if(view==getWindow().getDecorView().getRootView())
					break;
			}
		}catch (Exception e)
		{}
		return false;
	}

	/**
	 * Save to the database
	 */
	public void saveData()
	{
		// Checking for fullness of fields
		String atxt = getString(R.string.Not_filled); // Текст для алерта: "Не заполнено поле".
		boolean eFields = false; // У анкеты 2 состояния 1) Заполнены все обяз поля 2) Не заполнены все обяз поля


		if (!isGONE(edtObserverHealth) && edtObserverHealth.getText().toString().isBlank())
		{
			scrollTo(edtObserverHealth);
			atxt = atxt + ": \"" + getResources().getString(R.string.Name_of_the_HH_Env_monitoring_team_leader) + "\"!";
			eFields = true;
		}
		if (!eFields && !isGONE(edtMonitoringDate) && (((fieldDB)edtMonitoringDate).getValue() == null || ((fieldDB)edtMonitoringDate).getValue().isBlank()))
		{
			scrollTo(edtMonitoringDate);
			atxt = atxt + ": \"" + getResources().getString(R.string.Date_of_monitoring) + "\"!";
			eFields = true;
		}

		if (!eFields && (!isGONE(edtLatCenter) && edtLatCenter.getText().toString().isBlank() || Tools.getDouble(edtLatCenter.getText().toString(),0.0) == 0))
		{
			scrollTo(edtLatCenter);
			atxt = atxt + ": \"" + getResources().getString(R.string.Lat_center) + "\"!";
			eFields = true;
		}
		if (!eFields && (!isGONE(edtLonCenter) && edtLonCenter.getText().toString().isBlank() || Tools.getDouble(edtLonCenter.getText().toString(),0.0) == 0))
		{
			scrollTo(edtLonCenter);
			atxt = atxt + ": \"" + getResources().getString(R.string.Lon_center) + "\"!";
			eFields = true;
		}
		if (!eFields && !isGONE(edtBrigadeCount) && edtBrigadeCount.getText().toString().isBlank())
		{
			scrollTo(edtBrigadeCount);
			atxt = atxt + ": \"" + getResources().getString(R.string.Number_of_agents_in_control_team) + "\"!";
			eFields = true;
		}
		if (!eFields && !isGONE(edtBrigadeCountTrained) && edtBrigadeCountTrained.getText().toString().isBlank())
		{
			scrollTo(edtBrigadeCountTrained);
			atxt = atxt + ": \"" + getResources().getString(R.string.Number_of_agents_previously_trained_in_insecticide_handling_and_application) + "\"!";
			eFields = true;
		}
		if (!eFields && !isGONE(spiCalibrConsumptionCheck) && ((selectDB)spiCalibrConsumptionCheck).getText().toString().isBlank())
		{
			scrollTo(spiCalibrConsumptionCheck);
			atxt = atxt + ": \"" + getResources().getString(R.string.Flow_rate_of_sprayer_verified_during_this_monitoring_visit) + "\"!";
			eFields = true;
		}
		if (!eFields && !isGONE(spiCalibrPrecipitation) && ((selectDB)spiCalibrPrecipitation).getText().toString().isBlank())
		{
			scrollTo(spiCalibrPrecipitation);
			atxt = atxt + ": \"" + getResources().getString(R.string.Droplet_deposition_verified_during_this_monitoring_visit) + "\"!";
			eFields = true;
		}

		String value=((selectDB)spiEffControl2).getValue();
		if(value!=null && value.equals("1")){
			if (!eFields && !isGONE(edtEffMortality2) && edtEffMortality2.getText().toString().isBlank())
			{
				scrollTo(edtEffMortality2);
				atxt = atxt + ": \"" + getResources().getString(R.string.Biological_efficiency_of_treatment) + "\"!";
				eFields = true;
			}
			if (!eFields && !isGONE(edtEffPassedTime2) && edtEffPassedTime2.getText().toString().isBlank())
			{
				scrollTo(edtEffPassedTime2);
				atxt = atxt + ": \"" + getResources().getString(R.string.Time_after_treatment_hours) + "\"!";
				eFields = true;
			}
		}

		if (!eFields && !isGONE(spiHlthProtectiveClothingClean) && ((selectDB)spiHlthProtectiveClothingClean).getText().toString().isBlank())
		{
			scrollTo(spiHlthProtectiveClothingClean);
			atxt = atxt + ": \"" + getResources().getString(R.string.Protective_clothing_clean_and_in_good_state) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiSafObservedPollution) && ((selectDB)spiSafObservedPollution).getText().toString().isBlank())
		{
			scrollTo(spiSafObservedPollution);
			atxt = atxt + ": \"" + getResources().getString(R.string.Accidental_contamination_observed_or_reported) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiSafNonTarget2) && ((selectDB)spiSafNonTarget2).getText().toString().isBlank())
		{
			scrollTo(spiSafNonTarget2);
			atxt = atxt + ": \"" + getResources().getString(R.string.Effects_on_non_target_organisms_observed_or_reported) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskHouse) && ((selectDB)spiRiskHouse).getText().toString().isBlank())
		{
			scrollTo(spiRiskHouse);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_dwellings_or_housing_nearby_the_treatment) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskWater) && ((selectDB)spiRiskWater).getText().toString().isBlank())
		{
			scrollTo(spiRiskWater);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_surface_waters_nearby_the_treatment) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskApiary) && ((selectDB)spiRiskApiary).getText().toString().isBlank())
		{
			scrollTo(spiRiskApiary);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_apiculture_nearby_the_treatment) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskAgricultural) && ((selectDB)spiRiskAgricultural).getText().toString().isBlank())
		{
			scrollTo(spiRiskAgricultural);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_crops_treated_or_exposed_by_the_insecticide) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskSilk) && ((selectDB)spiRiskSilk).getText().toString().isBlank())
		{
			scrollTo(spiRiskSilk);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_sericulture_nearby_the_treatment) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskPastures) && ((selectDB)spiRiskPastures).getText().toString().isBlank())
		{
			scrollTo(spiRiskPastures);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_grassland_or_grazing_land_treated) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskPark) && ((selectDB)spiRiskPark).getText().toString().isBlank())
		{
			scrollTo(spiRiskPark);
			atxt = atxt + ": \"" + getResources().getString(R.string.Any_other_ecologically_sensitive_areas_nearby_the_treatment) + "\"!";
			eFields = true;
		}

		if (!eFields && !isGONE(spiRiskProbeAnalysis) && ((selectDB)spiRiskProbeAnalysis).getText().toString().isBlank())
		{
			scrollTo(spiRiskProbeAnalysis);
			atxt = atxt + ": \"" + getResources().getString(R.string.Samples_taken_for_residue_analysis) + "\"!";
			eFields = true;
		}

		if (eFields) // Если не заполнены все обязательные поля
		{
			m_Filled.setValue("0");

			AlertDialog.Builder adb = new AlertDialog.Builder(this,R.style.AlertDialogTheme);
			adb.setTitle(getString(R.string.Warning));

			adb.setMessage(atxt + "\n" + getString(R.string.not_filled_fields));
			adb.setPositiveButton(getString(R.string.Yes), new DialogInterface.OnClickListener()
			{
				@Override
				public void onClick(DialogInterface arg0, int arg1)
				{
					// Do nothing
				}
			});
			adb.setNegativeButton(getString(R.string.No), new DialogInterface.OnClickListener()
			{
				@Override
				public void onClick(DialogInterface arg0, int arg1)
				{
					String uid=guiTableHealth.write(); //Add or save data
					saveLocations(uid);
					LocustHealthActivity.this.finish(); // Close the form
				}
			});
			AlertDialog ad = adb.show();
			ad.getButton(AlertDialog.BUTTON_NEGATIVE).setTextColor(Color.BLACK);
			ad.getButton(AlertDialog.BUTTON_POSITIVE).setTextColor(Color.BLACK);

		} else
		{
			m_Filled.setValue("1");

			String uid=guiTableHealth.write(); //Добавляем либо сохраняем данные
			saveLocations(uid);

			startService(new Intent(this, MainService.class).putExtra(MainService.PARAM_ACTION, "1")); // Чтоб вызвать событие таймера в сервисе
			LocustHealthActivity.this.finish(); // Закрываем форму
		}
	}

	/**
	 * СМ. http://developer.android.com/reference/android/app/Activity.html Событие происходит при старте и при возврате на этот Activity
	 * */
	@Override
	public void onStart() {
		super.onStart();

		DbOpenHelper dboh = new DbOpenHelper(this);
		SQLiteDatabase rdb = null;
		Cursor cursor = null;
		try {
			rdb = dboh.getWritableDatabase();
			cursor = rdb.rawQuery("select * from terminals where del=0 and serial='"+ Secure.getString(getContentResolver(), Secure.ANDROID_ID)+"';", null);
			if(!cursor.moveToFirst())
			{
				Toast toast = Toast.makeText(getApplicationContext(),
						getResources().getString(R.string.Please_authorize_the_tablet), Toast.LENGTH_LONG);
				toast.show();
			}
		}finally{
			if(cursor!=null){ cursor.close(); }
			if(rdb!=null){ rdb.close(); }
		}
		dboh.close();
	}

	@Override
	public double getLat() {
		return this._lat;
	}

	@Override
	public double getLon() {
		return this._lon;
	}
}
