// CFileManagerDlg.cpp : implementation file
//

#include "stdafx.h"
#include "afxinet.h"
#include "dashboard.h"
#include "FileManagerDlg.h"
#include "FileEditDlg.h"
#include "AttribEditDlg.h"
#include "DashboardRecipient.h"
#include "resource.h"
#include "FileConnectDlg.h"
#include "StartMissionDlg.h"

//for configuration file
#include <utils/Attributes.h>
#include <utils/StringAttribute.h>
#include <utils/AttributeParser.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define FILEFTPCONFIG "FileFTP.cfg"

/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg dialog


CFileManagerDlg::CFileManagerDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CFileManagerDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CFileManagerDlg)
	//}}AFX_DATA_INIT

	//TRACE("CurDir: %s",m_HomeDir);

	m_inet = new CInternetSession();
	unsigned long hold;
	DWORD size = sizeof(hold);
	m_inet->QueryOption(INTERNET_OPTION_CONNECT_RETRIES,(void *)&hold,&size);
	TRACE("Retries: %d\n", hold);
	m_inet->QueryOption(INTERNET_OPTION_CONNECT_TIMEOUT,(void *)&hold,&size);
	TRACE("Timeout: %d\n", hold);
	m_inet->SetOption(INTERNET_OPTION_CONNECT_RETRIES,2);
	m_inet->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,1000);
	m_inet->QueryOption(INTERNET_OPTION_CONNECT_RETRIES,(void *)&hold,&size);
	TRACE("Retries: %d\n", hold);
	m_inet->QueryOption(INTERNET_OPTION_CONNECT_TIMEOUT,(void *)&hold,&size);
	TRACE("Timeout: %d\n", hold);
	m_ftpc = NULL;

	//defaults

}

CFileManagerDlg::~CFileManagerDlg()
{
	int i;
	delete m_inet;
	delete m_ftpc;
	for(i = 0; i < m_missionList.GetSize(); i++) {
		delete m_missionList[i];
	}
	for(i = 0; i < m_configList.GetSize(); i++) {
		delete m_configList[i];
	}
}

void CFileManagerDlg::ConfigureFTP(char * address1, BOOL connection1, char * address2, BOOL connection2)
{
	strcpy( m_IP, address1);

	//	if (connection1) strcpy(m_IP, address1);
	//	else if (connection2) strcpy(m_IP, address2);
	//	else MessageBox("Need to establish comms with a vehicle first");

}

void CFileManagerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFileManagerDlg)
	DDX_Control(pDX, IDC_NORMAL_STATIC, m_normalStatic);
	DDX_Control(pDX, IDC_SETNORMAL, m_setNormalButton);
	DDX_Control(pDX, IDC_ABORT_STATIC, m_abortStatic);
	DDX_Control(pDX, IDC_VEHICLE_RELOAD, m_vehicleReloadButton);
	DDX_Control(pDX, IDC_ATTRIBEDIT, m_attribEditButton);
	DDX_Control(pDX, IDC_JUMPABORT, m_jumpAbortMission);
	DDX_Control(pDX, IDC_JUMPMISSION, m_jumpMissionButton);
	DDX_Control(pDX, IDC_SETABORT, m_setAbortButton);
	DDX_Control(pDX, IDC_STARTMISSION, m_startButton);
	DDX_Control(pDX, IDC_REMOTEFILELIST, m_RemoteFileControl);
	DDX_Control(pDX, IDC_LOCALFILELIST, m_LocalFileControl);
	DDX_Control(pDX, IDC_TAB1, m_Tab1Ctrl);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CFileManagerDlg, CDialog)
	//{{AFX_MSG_MAP(CFileManagerDlg)
	ON_NOTIFY(TCN_SELCHANGE, IDC_TAB1, OnSelchangeTab1)
	ON_BN_CLICKED(IDC_DELBUTTONL, OnDelbuttonl)
	ON_BN_CLICKED(IDC_DELBUTTONR, OnDelbuttonr)
	ON_BN_CLICKED(IDC_ADDBUTTONL, OnAddbuttonl)
	ON_BN_CLICKED(IDC_LTOR, OnLtor)
	ON_BN_CLICKED(IDC_RTOL, OnRtol)
	ON_LBN_SELCHANGE(IDC_LOCALFILELIST, OnSelchangeLocalfilelist)
	ON_LBN_SELCHANGE(IDC_REMOTEFILELIST, OnSelchangeRemotefilelist)
	ON_LBN_DBLCLK(IDC_LOCALFILELIST, OnDblclkLocalfilelist)
	ON_BN_CLICKED(IDC_RAWEDIT, OnRawedit)
	ON_BN_CLICKED(IDC_ATTRIBEDIT, OnAttribedit)
	ON_BN_CLICKED(IDC_STARTMISSION, OnStartmission)
	ON_BN_CLICKED(IDC_JUMPMISSION, OnJumpmission)
	ON_BN_CLICKED(IDC_SETCONNECTION, OnSetconnection)
	ON_BN_CLICKED(IDC_RELOADREMOTE, OnReloadremote)
	ON_BN_CLICKED(IDC_JUMPABORT, OnJumpabort)
	ON_BN_CLICKED(IDC_RELOADLOCAL, OnReloadlocal)
	ON_BN_CLICKED(IDC_SETABORT, OnSetabort)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_VEHICLE_RELOAD, OnVehicleReload)
	ON_BN_CLICKED(IDC_SETNORMAL, OnSetnormal)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


BOOL CFileManagerDlg::OnInitDialog()
{
	BOOL val = CDialog::OnInitDialog();

	GetWindowText(m_title);

	loadConfiguration();

	DWORD dwExStyle= m_Tab1Ctrl.GetExtendedStyle();
	m_Tab1Ctrl.SetExtendedStyle(dwExStyle | TCS_EX_FLATSEPARATORS);

	TC_ITEM TabCtrlItem;
	TabCtrlItem.mask = TCIF_TEXT;
	TabCtrlItem.pszText = "Missions";
	m_Tab1Ctrl.InsertItem( 0, &TabCtrlItem );
	TabCtrlItem.pszText = "Config";
	m_Tab1Ctrl.InsertItem( 1, &TabCtrlItem );

	m_TabSel = 0;
	m_vehicleReloadButton.EnableWindow(False);
	LoadLocalConfigFiles();
	bool suc = LoadRemoteConfigFiles();
	if(suc != True) return val;
	LoadLocalMissionFiles();
	LoadRemoteMissionFiles();
	DisplayMissions();

	m_normalMisLabel.SubclassDlgItem(IDC_SHOW_NORMAL, this);
	m_abortMisLabel.SubclassDlgItem(IDC_SHOW_ABORT,this);

	m_normalMisLabel.SetFontSize(10);
	m_normalMisLabel.SetFontBold(True);
	m_abortMisLabel.SetFontSize(10);
	m_abortMisLabel.SetFontBold(True);

	m_abortMisLabel.SetWindowText(m_abortName.GetBuffer(0));

	fileEditDlg = NULL;
	attribEditDlg = NULL;

	return val;
}

void CFileManagerDlg::loadConfiguration()
{
	char *un, *pw, *md, *cd;
	char *an;
	Attributes attributes("FileManager");

	attributes.add(new StringAttribute("username","username", &un, "auv"));
	attributes.add(new StringAttribute("passwd", "passwd", &pw, "auv"));
	attributes.add(new StringAttribute("misDir",
		"mission directory", &md,"onboard/missions"));
	attributes.add(new StringAttribute("configDir",
		"config directory", &cd, "onboard/config"));
	attributes.add(new StringAttribute("defAbort", "default abort plan",
		&an, "abortMplan.cfg"));

	CString path = m_homeDir+"\\"+FILEFTPCONFIG;

	try{
		AttributeParser::parse(path.GetBuffer(0), &attributes);
	} catch(Exception e) {
		CString hold = e.msg;
		CString temp = hold+"FTP config was not successfully loaded. FTP parameters set to defaults.";
		MessageBox(temp.GetBuffer(0));
		TRACE("AttributeParser in FileManager threw message: %s",
                       e.msg );
	} catch(...) {
		TRACE("Something wrong with attribute parser in file manager dialogue\n");
	}

	m_username = un;
	m_passwd = pw;
	m_missionDir = md;
	m_configDir = cd;
	m_defaultAbort = an;
	m_abortName = an;

	UpdateData(False);

	free(un);
	free(pw);
	free(md);
	free(cd);
	free(an);
}

void CFileManagerDlg::storeConfiguration()
{
	char *un, *pw, *md, *cd;
	char *an;
	Attributes attributes("FileManager");

	attributes.add(new StringAttribute("username","username", &un, m_username.GetBuffer(0)));
	attributes.add(new StringAttribute("passwd", "passwd", &pw, m_passwd.GetBuffer(0)));
	attributes.add(new StringAttribute("misDir",
		"mission directory", &md,m_missionDir.GetBuffer(0)));
	attributes.add(new StringAttribute("configDir",
		"config directory", &cd, m_configDir.GetBuffer(0)));
	attributes.add(new StringAttribute("defAbort", "default abort plan",
		&an, m_defaultAbort.GetBuffer(0)));

	CString path = m_homeDir+"\\"+FILEFTPCONFIG;

	try{
		AttributeParser::unparse(path.GetBuffer(0), &attributes, NULL);
	} catch(...) {
		TRACE("Something wrong with attribute parser in file manager dialogue\n");
	}

	free(un);
	free(pw);
	free(md);
	free(cd);
	free(an);
}



void CFileManagerDlg
::setRecipient(CDashboardRecipient *recipient)
{
	m_recipient = recipient;
}

void CFileManagerDlg::setUsername(CString un)
{
	m_username = un;
}

void CFileManagerDlg::setPasswd(CString pw)
{
	m_passwd = pw;
}

void CFileManagerDlg::setMissionDir(CString md)
{
	m_missionDir = md;
}

int CFileManagerDlg::getNumMissions()
{
	return m_missionList.GetSize();
}

CString CFileManagerDlg::getMissionName(int i)
{
	if(i < 0 || i > m_missionList.GetSize()){
		CString rnull;
		return rnull;
	}
	return *m_missionList[i];
}


void CFileManagerDlg::DeleteAttribEdit()
{
	if(attribEditDlg != NULL) {
		m_recipient->removeDataRecipient(attribEditDlg);
		attribEditDlg->beforeDestroy();
		attribEditDlg->DestroyWindow();
		delete attribEditDlg;
		attribEditDlg = NULL;
	}
}

/////////////////////////////////////////////////////////////////////////////
// CFileManagerDlg message handlers

void CFileManagerDlg::OnSelchangeLocalfilelist()
{
	// Load the selected mission file, display it
	UpdateData(TRUE);
}

void CFileManagerDlg::OnSelchangeRemotefilelist()
{
	// Load the selected mission file, display it
	UpdateData(TRUE);

}



void CFileManagerDlg::LoadLocalMissionFiles()
{
	// Read missions from the local repository, put them into the list
	m_LocalFileControl.ResetContent();
	char path[128];
	sprintf(path,"%s\\missions\\",m_homeDir.GetBuffer(0));
	DlgDirList(path,IDC_LOCALFILELIST,0,DDL_READWRITE);
	SetWindowText(m_title);
	//UpdateData(FALSE);
}

void CFileManagerDlg::UpdateIP()
{
	char addrOne[32];
	char addrTwo[32];
	bool isCon1,isCon2;
	m_dd->getCommsInfo(addrOne, &isCon1, addrTwo, &isCon2);
	if(isCon1) {
		strcpy(m_IP, addrOne);
	} else if(isCon2) {
		strcpy(m_IP, addrTwo);
	}

	//if neither for now use the top one
	if(!isCon1 && !isCon2) {
		strcpy(m_IP, addrOne);
	}
}



void CFileManagerDlg::OpenFTP(int x)
{
	if(m_ftpc != NULL) {
		m_ftpc->Close();
		delete m_ftpc;
		m_ftpc = NULL;
	}
	UpdateIP();
	m_ftpc = m_inet->GetFtpConnection( m_IP, m_username.GetBuffer(0), m_passwd.GetBuffer(0));
	CFtpFileFind ftpFind(m_ftpc);
	switch(x) {
	case 0:
		m_ftpc->SetCurrentDirectory(m_missionDir.GetBuffer(0));
		break;
	case 1:
		m_ftpc->SetCurrentDirectory(m_configDir.GetBuffer(0));
		break;
	}
}

bool CFileManagerDlg::LoadRemoteMissionFiles()
{
	// Read (ftp) the missions from the vehicle, put them into the list
	if (m_ftpc != NULL) {
		m_ftpc->Close();
		delete m_ftpc;
		m_ftpc = NULL;
	}
	UpdateIP();
	try {
		m_ftpc = m_inet->GetFtpConnection( m_IP, m_username.GetBuffer(0), m_passwd.GetBuffer(0));
	} catch(CInternetException* pEx) {
		m_ftpc = NULL;
		// catch errors from WinINet
		TCHAR szErr[1024];
		if (pEx->GetErrorMessage(szErr, 1024))
		pEx->Delete();
		m_ftpc = NULL;
		CString temp = szErr;
		CString t = "Ftp connection to IP " + temp + " failed.  Please check IP address and username/passwd.";
		//this->MessageBox(t);
		return false;
	} catch(...) {
		TRACE("Something not working.\n");
		return false;
	}

	CFtpFileFind *ftpFind = new CFtpFileFind(m_ftpc);
	m_ftpc->SetCurrentDirectory(m_missionDir.GetBuffer(0));

	BOOL bContinue = ftpFind->FindFile();
	if (!bContinue)
	{
		// the directory is empty; just close up and return.
		ftpFind->Close();
		return true;
	}

	BOOL bDir = FALSE;
	m_RemoteFileControl.ResetContent();
	CString* strFileName;

	while (bContinue)
	{
		// FindNextFile muxt be called before info can be gleaned from ftpFind
		bContinue = ftpFind->FindNextFile();
		CString temp = ftpFind->GetFileName();
		strFileName = new CString(temp);
		m_missionList.Add(strFileName);
	}

	UpdateData(FALSE);
	delete ftpFind;
	return true;
}

void CFileManagerDlg::DisplayMissions()
{
	int i;
	m_TabSel = m_Tab1Ctrl.GetCurSel();
	m_RemoteFileControl.ResetContent();
	switch(m_TabSel)
	{
	case 0:
		for(i = 0; i < m_missionList.GetSize(); i++){
			m_RemoteFileControl.AddString(m_missionList[i]->GetBuffer(0));
		}
		break;
	case 1:
		for(i = 0; i < m_configList.GetSize(); i++){
			m_RemoteFileControl.AddString(m_configList[i]->GetBuffer(0));
		}
		break;
	}
}


void CFileManagerDlg::LoadLocalConfigFiles()
{
	m_LocalFileControl.ResetContent();
	char path[128];
	sprintf(path,"%s\\config\\",m_homeDir.GetBuffer(0));
	DlgDirList(path,IDC_LOCALFILELIST,0,DDL_READWRITE);
	SetWindowText(m_title);
	UpdateData(FALSE);
}

bool CFileManagerDlg::LoadRemoteConfigFiles()
{

	// Read (ftp) the config files from the vehicle, put them into the list
	if (m_ftpc != NULL) {
		m_ftpc->Close();
		delete m_ftpc;
		m_ftpc = NULL;
	}
	UpdateIP();
	try {
		m_ftpc = m_inet->GetFtpConnection( m_IP, m_username.GetBuffer(0), m_passwd.GetBuffer(0));
	} catch(CInternetException* pEx) {
		m_ftpc = NULL;
		// catch errors from WinINet
		TCHAR szErr[1024];
		if (pEx->GetErrorMessage(szErr, 1024))
		pEx->Delete();
		m_ftpc = NULL;
		CString temp = szErr;
		CString t = "Ftp connection to IP " + temp + " failed.  Please check IP address and username/passwd.";
		//this->MessageBox(t);
		return false;
	} catch(...) {
		TRACE("Something not working.\n");
		return false;
	}

	CFtpFileFind *ftpFind = new CFtpFileFind(m_ftpc);
	CString temp;
	m_ftpc->GetCurrentDirectory(temp);
	m_ftpc->SetCurrentDirectory(m_configDir.GetBuffer(0));

	BOOL bContinue = ftpFind->FindFile();
	if (!bContinue)
	{
		// the directory is empty; just close up and return.
		ftpFind->Close();
		return true;
	}

	BOOL bDir = FALSE;
	m_RemoteFileControl.ResetContent();
	CString* strFileName;

	while (bContinue)
	{
		// FindNextFile muxt be called before info can be gleaned from ftpFind
		bContinue = ftpFind->FindNextFile();
		CString temp = ftpFind->GetFileName();
		strFileName = new CString(temp);
		m_configList.Add(strFileName);
	}

	UpdateData(FALSE);
	delete ftpFind;
	return true;
}


void CFileManagerDlg::OnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult)
{
	m_TabSel = m_Tab1Ctrl.GetCurSel();
	if(m_ftpc != NULL) {
		m_ftpc->Close();
		delete m_ftpc;
		m_ftpc = NULL;
	}
	SetCurrentDirectory(m_homeDir.GetBuffer(0));

	switch(m_TabSel)
	{
	case 0:
		LoadLocalMissionFiles();
		m_startButton.ShowWindow(SW_SHOW);
		m_attribEditButton.EnableWindow(True);
		m_jumpMissionButton.ShowWindow(SW_SHOW);
		m_jumpAbortMission.ShowWindow(SW_SHOW);
		m_setAbortButton.EnableWindow(True);
		m_setNormalButton.EnableWindow(True);
		m_vehicleReloadButton.EnableWindow(False);
		m_abortStatic.ShowWindow(SW_SHOW);
		m_abortMisLabel.ShowWindow(SW_SHOW);
		m_normalStatic.ShowWindow(SW_SHOW);
		m_normalMisLabel.ShowWindow(SW_SHOW);
		break;
	case 1:
		LoadLocalConfigFiles();
		m_startButton.ShowWindow(SW_HIDE);
		m_attribEditButton.EnableWindow(False);
		m_jumpMissionButton.ShowWindow(SW_HIDE);
		m_jumpAbortMission.ShowWindow(SW_HIDE);
		m_setAbortButton.EnableWindow(False);
		m_setNormalButton.EnableWindow(False);
		m_vehicleReloadButton.EnableWindow(True);
		m_abortStatic.ShowWindow(SW_HIDE);
		m_abortMisLabel.ShowWindow(SW_HIDE);
		m_normalStatic.ShowWindow(SW_HIDE);
		m_normalMisLabel.ShowWindow(SW_HIDE);
		break;
	}

	OpenFTP(m_TabSel);
	DisplayMissions();

	*pResult = 0;
}


void CFileManagerDlg::OnAddbuttonl()
{
	// TODO: Add your control notification handler code here
	CFileDialog * cfd = new CFileDialog(TRUE,".cfg");
	cfd->DoModal();

	CString t = (m_TabSel == 0)?"missions":"config";
	CString path = m_homeDir+"\\"+t+"\\"+cfd->GetFileName();

	CopyFile(cfd->GetPathName().GetBuffer(0),path.GetBuffer(0), FALSE);
	switch (m_TabSel){
	case 0: LoadLocalMissionFiles(); break;
	case 1: LoadLocalConfigFiles(); break;
	}

	delete cfd;
}

void CFileManagerDlg::OnDelbuttonl()
{
	int index = m_LocalFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_LocalFileControl.GetText(index, tempS);
	remove(tempS);
	OnReloadlocal();
}

void CFileManagerDlg::OnDelbuttonr()
{
	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);
	m_RemoteFileControl.DeleteString(index);
	m_ftpc->Remove(tempS);
	OnReloadremote();
}

/*
void CFileManagerDlg::OnSyncrtol()
{
	CString strFileName;
	BOOL bDir;
	BOOL bContinue;

	// Clear files off of the vehicle
	if (m_ftpc != NULL) {
		m_ftpc->Close();
		delete m_ftpc;
		m_ftpc = NULL;
	}
	m_ftpc = m_inet->GetFtpConnection(m_IP, m_username.GetBuffer(0), m_passwd.GetBuffer(0));
	CFtpFileFind ftpFind(m_ftpc);

	for (int i=0;i<2;i++) {
		switch(i) {
		case 0:	
			m_ftpc->SetCurrentDirectory(m_missionDir.GetBuffer(0));
			break;
		case 1:
			m_ftpc->SetCurrentDirectory(m_configDir.GetBuffer(0));
			break;
		}

		bContinue = ftpFind.FindFile();
		if (!bContinue)
		{
			// the directory is empty; just close up and return.
			ftpFind.Close();
			return;
		}

		bDir = FALSE;

		while (bContinue)
		{
			// FindNextFile muxt be called before info can be gleaned from ftpFind
			bContinue = ftpFind.FindNextFile();
			strFileName = ftpFind.GetFileName();
			SetWindowText(m_title + " Removing " + strFileName);
			m_ftpc->Remove(strFileName);
		}

		// Write (ftp) the files back to the vehicle
		for (int i=0;i<m_LocalFileControl.GetCount();i++) {
			m_LocalFileControl.GetText(i,strFileName);
			SetWindowText(m_title + " Putting " + strFileName);
			m_ftpc->PutFile(strFileName, strFileName, FALSE);
		}
		m_ftpc->SetCurrentDirectory("..");
	}
	switch (m_TabSel){
	case 0: LoadRemoteMissionFiles(); LoadLocalMissionFiles(); break;
	case 1: LoadRemoteConfigFiles(); LoadLocalConfigFiles(); break;
	}

	SetWindowText(m_title);
	//UpdateData(FALSE);
}
*/

void CFileManagerDlg::OnLtor()
{
	int index = m_LocalFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_LocalFileControl.GetText(index, tempS);

	UpdateWindow();
	if(m_RemoteFileControl.FindString(0,tempS.GetBuffer(0)) != LB_ERR) {
		CString t = "The file " + tempS + " already exists on the vehicle.  Replace?";
		if(MessageBox(t.GetBuffer(0), "Replace file?", MB_YESNO) != IDYES) return;
		m_ftpc->Remove(tempS);
	}

	SetWindowText(m_title + " Putting " + tempS);
	UpdateData(FALSE);

	m_ftpc->PutFile(tempS, tempS, FTP_TRANSFER_TYPE_ASCII);

	OnReloadremote();
	SetWindowText(m_title);
	UpdateData(FALSE);
}

void CFileManagerDlg::OnRtol()
{
	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);

	UpdateWindow();

	if(m_LocalFileControl.FindString(0, tempS.GetBuffer(0)) != LB_ERR) {
		CString t = "The file " + tempS + " already exists locally.  Replace?";
		if(MessageBox(t.GetBuffer(0), "Replace file?", MB_YESNO) != IDYES) return;
		remove(tempS);
	}

	SetWindowText(m_title + " Getting " + tempS);
	UpdateData(FALSE);
	UpdateWindow();
	m_ftpc->GetFile(tempS, tempS, FTP_TRANSFER_TYPE_ASCII);

	OnReloadlocal();
	SetWindowText(m_title);
	UpdateData(FALSE);
}


void CFileManagerDlg::OnDblclkLocalfilelist()
{
	/*
	UpdateData(TRUE);
	char path[128];
	sprintf(path,"%s\\%s\\%s",m_HomeDir,(m_TabSel == 0)?"missions":"config", m_LocalFileSelection.GetBuffer(0));
	CFileEditDlg fileEditDlg = new CFileEditDlg(this);
	fileEditDlg.SetFileName(path);
	fileEditDlg.DoModal();
	*/
}

void CFileManagerDlg::OnRawedit()
{
	UpdateData(TRUE);
	int index = m_LocalFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_LocalFileControl.GetText(index, tempS);

	CString t = (m_TabSel == 0)?"missions":"config";
	CString path = m_homeDir+"\\"+t+"\\"+tempS;

	DeleteFileEdit();

	fileEditDlg = new CFileEditDlg(this);
	fileEditDlg->setFileManager(this);
	fileEditDlg->SetFileName(path.GetBuffer(0));
	fileEditDlg->Create(IDD_FILEEDIT_DLG);
	fileEditDlg->ShowWindow(SW_SHOWNORMAL);
	//fileEditDlg.DoModal();

}

void CFileManagerDlg::DeleteFileEdit()
{
	if(fileEditDlg != NULL) {
		fileEditDlg->DestroyWindow();
		delete fileEditDlg;
		fileEditDlg = NULL;
	}
}

void CFileManagerDlg::OnAttribedit()
{
	UpdateData(True);
	int index = m_LocalFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_LocalFileControl.GetText(index, tempS);
	CString t = (m_TabSel == 0)?"missions":"config";
	CString path = m_homeDir+"\\"+t+"\\"+tempS;

	DeleteAttribEdit();

	attribEditDlg = new CAttribEditDlg(this);
	attribEditDlg->setFileManager(this);
	attribEditDlg->setFileName(path);
	attribEditDlg->setRecipient(m_recipient);
	m_recipient->addDataRecipient(attribEditDlg);
	attribEditDlg->Create(IDD_ATTRIBEDIT_DLG);
	attribEditDlg->ShowWindow(SW_SHOWNORMAL);

	//attribEditDlg.DoModal();
}

void CFileManagerDlg::OnStartmission()
{
	UpdateData(TRUE);

	if(m_normalName.IsEmpty()) {
		MessageBox("Please select a normal mission");
		return;
	}

	CStartMissionDlg* startMis = new CStartMissionDlg(this);
	startMis->setNormalName(m_normalName);
	startMis->setAbortName(m_abortName);

	CString t = "Confirming mission information";
	startMis->setWindowTitle(t);

	startMis->DoModal();

	if(!(startMis->dataGood())) return;

	if(m_abortName == m_defaultAbort){
		//CString mes = "Start mission name "+m_RemoteFileSelection+" with default abort plan?";
		//if(MessageBox(mes,"Confirm",MB_YESNO) != IDYES) return;
		m_recipient->setMission(m_normalName.GetBuffer(0), "", 1);
	} else {
		if(m_abortName.IsEmpty()) return;
		//CString mes = "Start mission name "+m_RemoteFileSelection+" with abort plan "+m_abortName+" ?";
		//if(MessageBox(mes,"Confirm",MB_YESNO) != IDYES) return;
		m_recipient->setMission(m_normalName.GetBuffer(0), m_abortName.GetBuffer(0), 1);
	}

	if(startMis->getJumpNum() != 0) {
		m_recipient->setJumpBehavior(startMis->getJumpNum());
	}

	ShowMissionAttrib(m_normalName, m_abortName);
	m_dd->showMissionControl();

	delete startMis;
}

void CFileManagerDlg::ShowMissionAttrib(CString normal, CString abort)
{
	//if the mission is also on the local side open it in attrib edit
	int onLocal = m_LocalFileControl.FindStringExact(-1, normal.GetBuffer(0));
	int abortLocal = m_LocalFileControl.FindStringExact(-1, abort.GetBuffer(0));
	if(onLocal != LB_ERR) {
		CString t = "missions";
		CString path = m_homeDir+"\\"+t+"\\"+normal;
		CString abortPath = m_homeDir+"\\"+t+"\\"+abort;

		DeleteAttribEdit();

		attribEditDlg = new CAttribEditDlg(this);
		attribEditDlg->setFileManager(this);
		attribEditDlg->setFileName(path);
		if(abortLocal != LB_ERR){
			attribEditDlg->setAbortName(abortPath);
		} else {
			CString s = "Abort mission file not found locally.";
			this->MessageBox(s);
		}
		attribEditDlg->setRecipient(m_recipient);
		m_recipient->addDataRecipient(attribEditDlg);
		attribEditDlg->Create(IDD_ATTRIBEDIT_DLG);
		attribEditDlg->ShowWindow(SW_SHOWNORMAL);
	} else {
		CString s = "Mission file not found locally.";
		this->MessageBox(s);
	}
}

void CFileManagerDlg::OnJumpmission()
{
	UpdateData(TRUE);

	/*
	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);
	*/

	if(m_normalName.IsEmpty()) {
		MessageBox("Please select a normal mission");
		return;
	}

	CString tempS = m_normalName;

	CStartMissionDlg* startMis = new CStartMissionDlg(this);
	startMis->setNormalName(tempS);
	startMis->setAbortName("Not being changed");
	CString t = "Changing normal mission";
	startMis->setWindowTitle(t);

	startMis->DoModal();

	if(!(startMis->dataGood())) return;

	int jNum = startMis->getJumpNum();

	if(jNum == 0) jNum = -1;
	m_recipient->setNormalMissionName(tempS.GetBuffer(0), jNum);

	if(attribEditDlg != NULL){
		m_abortName = attribEditDlg->getCurrentAbort();
		DeleteAttribEdit();
	}

	//if(m_normal.IsEmpty()) return;
	m_normalName = tempS;

	ShowMissionAttrib(tempS, m_abortName);

	delete startMis;
}

//we really should hose the old window and open up a new one
void CFileManagerDlg::OnJumpabort()
{
	UpdateData(TRUE);

	/*
	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);
	*/

	CString tempS = m_abortName;

	CStartMissionDlg* startMis = new CStartMissionDlg(this);
	startMis->setNormalName("Not being changed");
	startMis->setAbortName(tempS);
	CString t = "Changing abort mission";
	startMis->setWindowTitle(t);

	startMis->DoModal();

	if(!(startMis->dataGood())) return;

	int jNum = startMis->getJumpNum();

	if(jNum == 0) jNum = -1;
	m_recipient->setAbortMissionName(tempS.GetBuffer(0), jNum);

	m_recipient->setAbortMissionName(tempS.GetBuffer(0));

	if(attribEditDlg != NULL){
		m_normalName = attribEditDlg->getCurrentNormal();
		DeleteAttribEdit();
	}

	m_abortName = tempS;

	ShowMissionAttrib(m_normalName, m_abortName);

	delete startMis;
}

void CFileManagerDlg::OnSetconnection()
{

	CFileConnectDlg *fcd = new CFileConnectDlg(this);
	CString tempUsr = m_username;
	fcd->setUsr(tempUsr);
	fcd->setPas(m_passwd);

	m_TabSel = m_Tab1Ctrl.GetCurSel();
	switch(m_TabSel)
	{
	case 0:
		fcd->setMis(m_missionDir);
		break;
	case 1:
		fcd->setMis(m_configDir);
		break;
	}
	fcd->DoModal();

	if(fcd->dataGood()) {
		m_username = fcd->getUsr();
		m_passwd = fcd->getPas();
		switch(m_TabSel)
		{
		case 0:
			m_missionDir = fcd->getMis();
			break;
		case 1:
			m_configDir = fcd->getMis();
			break;
		}
		storeConfiguration();
	}
	OnReloadremote();
	//TRACE("%s %s %s\n", m_username.GetBuffer(0), m_passwd.GetBuffer(0), m_missionDir.GetBuffer(0));

	delete fcd;

}

void CFileManagerDlg::OnReloadremote()
{
	int i;
	m_TabSel = m_Tab1Ctrl.GetCurSel();
	switch(m_TabSel)
	{
	case 0:
		for(i = 0; i < m_missionList.GetSize(); i++) {
			delete m_missionList[i];
		}
		m_missionList.RemoveAll();
		LoadRemoteMissionFiles();
		break;
	case 1:
		for(i = 0; i < m_configList.GetSize(); i++) {
			delete m_configList[i];
		}
		m_configList.RemoveAll();
		LoadRemoteConfigFiles();
		break;
	}
	DisplayMissions();
}



void CFileManagerDlg::OnReloadlocal()
{
	m_TabSel = m_Tab1Ctrl.GetCurSel();
	switch(m_TabSel)
	{
	case 0:
		LoadLocalMissionFiles();
		break;
	case 1:
		LoadLocalConfigFiles();
		break;
	}
}

void CFileManagerDlg::OnSetabort()
{
	UpdateData(TRUE);

	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);

	CString mes = "Do you want to set abort mission to "+tempS+" ?";

	if(MessageBox(mes,"Confirm",MB_YESNO) == IDYES)
		m_abortName = tempS;

	m_abortMisLabel.SetWindowText(m_abortName.GetBuffer(0));
	UpdateData(False);

}

void CFileManagerDlg::OnClose()
{
	CDialog::OnClose();
}

void CFileManagerDlg::OnVehicleReload()
{
	CString mes = "Vehicle Reload will kill all running servers and drivers.  Do you wish to proceed?";

	if(MessageBox(mes,"Confirm",MB_YESNO) == IDYES) {
		m_recipient->setString("reloadVehicle");
		m_dd->closeDevCheckout();
	}

}

void CFileManagerDlg::OnSetnormal() 
{
	UpdateData(TRUE);

	int index = m_RemoteFileControl.GetCurSel();
	if(index == LB_ERR) return;
	CString tempS;
	m_RemoteFileControl.GetText(index, tempS);

	CString mes = "Do you want to set normal mission to "+tempS+" ?";

	if(MessageBox(mes,"Confirm",MB_YESNO) == IDYES)
		m_normalName = tempS;

	m_normalMisLabel.SetWindowText(m_normalName.GetBuffer(0));
	UpdateData(False);

}
