//
// DlgScheduleItem.cpp
//
// Copyright (c) Shareaza Development Team, 2002-2004.
// This file is part of SHAREAZA (www.shareaza.com)
//
// Shareaza is free software; you can redistribute it
// and/or modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Shareaza is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Shareaza; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//

#include "StdAfx.h"
#include "Shareaza.h"
#include "Settings.h"
#include "Scheduler.h"
#include "Network.h"
#include "Skin.h"
#include "DlgScheduleItem.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

BEGIN_MESSAGE_MAP(CScheduleItemDlg, CSkinDialog)
	//{{AFX_MSG_MAP(CScheduleItemDlg)
	//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_ONLYONCE, OnBnClickedOnlyonce)
ON_BN_CLICKED(IDC_SCHEDULER_TOGGLE_BANDWIDTH, OnBnClickedToggleBandwidth)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_DATE, OnDtnDatetimechangeDate)
ON_NOTIFY(DTN_DATETIMECHANGE, IDC_TIME, OnDtnDatetimechangeTime)
ON_BN_CLICKED(IDC_EVERYDAY, OnBnClickedEveryday)
ON_BN_CLICKED(IDC_ACTIVE, OnBnClickedActive)
ON_CBN_SELCHANGE(IDC_EVENTTYPE, OnCbnSelchangeEventtype)
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CSecureRuleDlg dialog

CScheduleItemDlg::CScheduleItemDlg(CWnd* pParent, CScheduleItem* pSchItem) : CSkinDialog(CScheduleItemDlg::IDD, pParent)
{

	//{{AFX_DATA_INIT(CScheduleItemDlg)

	//}}AFX_DATA_INIT
	
	if (pSchItem)
		// Existing task (edit)
	{
		m_pScheduleItem = pSchItem;
		m_bEveryDay = pSchItem->m_bEveryDay;
		m_nAction = pSchItem->m_nAction;
		m_sDescription = pSchItem->m_sDescription;
		m_bNewItem = false;

		m_tTempDateTime = pSchItem->m_tScheduleDateTime;

		m_tDateAndTime = pSchItem->m_tScheduleDateTime;

		m_bActive = pSchItem->m_bActive;
		
		m_nLimited			= pSchItem->m_nLimited;
		m_nLimitedDown		= pSchItem->m_nLimitedDown;
		m_nLimitedUp		= pSchItem->m_nLimitedUp;
		m_bToggleBandwidth	= pSchItem->m_bToggleBandwidth;
		m_bLimitedNetworks	= pSchItem->m_bLimitedNetworks;

	}
	else
	{
		// New task
		m_pScheduleItem = NULL;
		m_bNewItem = true;
		m_bEveryDay = false;
		m_nAction = 0;
		m_sDescription = "";

		m_tTempDateTime = 0;

		m_tDateAndTime = 0;

		m_bActive = true;
			
		m_nLimited			= 50;
		m_nLimitedDown		= 50;
		m_nLimitedUp		= 50;
		m_bToggleBandwidth	= false;
		m_bLimitedNetworks	= false;
	}
}

CScheduleItemDlg::~CScheduleItemDlg()
{
	if (m_pScheduleItem && m_bNewItem)
		delete m_pScheduleItem;
}

void CScheduleItemDlg::DoDataExchange(CDataExchange* pDX)
{
	CSkinDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CScheduleItemDlg)

	//}}AFX_DATA_MAP
	DDX_Control(pDX, IDC_DATE, m_wndDate);
	DDX_Control(pDX, IDC_TIME, m_wndTime);
	DDX_Text(pDX, IDC_DESCRIPTION, m_sDescription);
	DDX_Control(pDX, IDC_SCHEDULER_LIMITED_SPIN, m_wndSpin);
	DDX_Control(pDX, IDC_SCHEDULER_LIMITED_SPIN_DOWN, m_wndSpinDown);
	DDX_Control(pDX, IDC_SCHEDULER_LIMITED_SPIN_UP, m_wndSpinUp);
	DDX_Check(pDX, IDC_SCHEDULER_TOGGLE_BANDWIDTH, m_bToggleBandwidth);
	DDX_Check(pDX, IDC_SCHEDULER_LIMITED_NETWORKS, m_bLimitedNetworks);
	DDX_Text(pDX, IDC_SCHEDULER_LIMITED, m_nLimited);
	DDX_Text(pDX, IDC_SCHEDULER_LIMITED_DOWN, m_nLimitedDown);
	DDX_Text(pDX, IDC_SCHEDULER_LIMITED_UP, m_nLimitedUp);
}

/////////////////////////////////////////////////////////////////////////////
// CSecureRuleDlg message handlers

BOOL CScheduleItemDlg::OnInitDialog() 
{
	CSkinDialog::OnInitDialog();

	SkinMe( _T("CScheduleItemDlg"), IDR_SCHEDULERFRAME );

	m_pwndRadioOnce = (CButton *)GetDlgItem(IDC_ONLYONCE);
	m_pwndRadioEveryDay = (CButton *)GetDlgItem(IDC_EVERYDAY);
	m_pwndActiveCheck = (CButton *)GetDlgItem(IDC_ACTIVE);
	m_pwndTypeSel = (CComboBox *)GetDlgItem(IDC_EVENTTYPE);
	m_pwndLimitedEdit = (CEdit *)GetDlgItem(IDC_SCHEDULER_LIMITED);
	m_pwndLimitedEditDown = (CEdit *)GetDlgItem(IDC_SCHEDULER_LIMITED_DOWN);
	m_pwndLimitedEditUp = (CEdit *)GetDlgItem(IDC_SCHEDULER_LIMITED_UP);
	m_pwndLimitedCheck2 = (CButton *)GetDlgItem(IDC_SCHEDULER_TOGGLE_BANDWIDTH);
	m_pwndLimitedCheck = (CButton *)GetDlgItem(IDC_SCHEDULER_LIMITED_NETWORKS);
	m_pwndLimitedStatic = (CStatic *)GetDlgItem(IDC_STATIC_LIMITED);
	m_pwndLimitedStaticDown = (CStatic *)GetDlgItem(IDC_STATIC_LIMITED_DOWN);
	m_pwndLimitedStaticUp = (CStatic *)GetDlgItem(IDC_STATIC_LIMITED_UP);

	m_pwndActiveCheck->SetCheck(1);

	m_wndSpin.SetRange( 5, 95 );
	m_wndSpinDown.SetRange( 5, 95 );
	m_wndSpinUp.SetRange( 5, 95 );

	m_pwndTypeSel->AddString(_T("Bandwidth: Full Speed"));
	m_pwndTypeSel->AddString(_T("Bandwidth: Reduced Speed"));
	m_pwndTypeSel->AddString(_T("Bandwidth: Stop"));
	m_pwndTypeSel->AddString(_T("System: Exit Shareaza"));
	m_pwndTypeSel->AddString(_T("System: Disconnect Dial-up Connection"));
	m_pwndTypeSel->AddString(_T("System: Turn Off the Computer"));

	if (m_bNewItem)
	{
		m_wndDate.GetTime(m_tTempDateTime);
		m_tDateAndTime = m_tTempDateTime;


		m_wndTime.GetTime(m_tTempDateTime);
		m_tDateAndTime = m_tTempDateTime;


		m_pwndRadioOnce->SetCheck(1);
		m_pwndRadioEveryDay->SetCheck(0);

		m_pwndLimitedEdit->EnableWindow(false);
		m_pwndLimitedEditDown->EnableWindow(false);
		m_pwndLimitedEditUp->EnableWindow(false);
		m_wndSpin.EnableWindow(false);
		m_wndSpinDown.EnableWindow(false);
		m_wndSpinUp.EnableWindow(false);
		m_pwndLimitedCheck2->EnableWindow(false);
		m_pwndLimitedCheck->EnableWindow(false);
		m_pwndLimitedStatic->EnableWindow(false);
		m_pwndLimitedStaticDown->EnableWindow(false);
		m_pwndLimitedStaticUp->EnableWindow(false);
	}
	else
	{
		m_pwndTypeSel->SetCurSel(m_nAction-1);
		m_pwndRadioOnce->SetCheck(!m_bEveryDay);
		m_pwndRadioEveryDay->SetCheck(m_bEveryDay);
		m_wndDate.SetTime(&m_tDateAndTime);
		m_wndTime.SetTime(&m_tDateAndTime);

		if (m_pwndRadioEveryDay->GetCheck())
			m_wndDate.EnableWindow(false);

		if (m_pwndTypeSel->GetCurSel() == 1)
		{
			if (!m_pwndLimitedCheck2->GetCheck())
			{
				m_pwndLimitedEdit->EnableWindow(true);
				m_wndSpin.EnableWindow(true);
			}
			else
			{
				m_pwndLimitedEditDown->EnableWindow(true);
				m_pwndLimitedEditUp->EnableWindow(true);
				m_wndSpinDown.EnableWindow(true);
				m_wndSpinUp.EnableWindow(true);				
			}
			m_pwndLimitedCheck2->EnableWindow(true);
			m_pwndLimitedCheck->EnableWindow(true);
			m_pwndLimitedStatic->EnableWindow(true);
			m_pwndLimitedStaticDown->EnableWindow(true);
			m_pwndLimitedStaticUp->EnableWindow(true);
		}
		else
		{
			m_pwndLimitedEdit->EnableWindow(false);
			m_pwndLimitedEditDown->EnableWindow(false);
			m_pwndLimitedEditUp->EnableWindow(false);
			m_wndSpin.EnableWindow(false);
			m_wndSpinDown.EnableWindow(false);
			m_wndSpinUp.EnableWindow(false);
			m_pwndLimitedCheck2->EnableWindow(false);
			m_pwndLimitedCheck->EnableWindow(false);
			m_pwndLimitedStatic->EnableWindow(false);
			m_pwndLimitedStaticDown->EnableWindow(false);
			m_pwndLimitedStaticUp->EnableWindow(false);
		}
	}

	m_wndSpin.SetPos(m_nLimited);
	m_wndSpinDown.SetPos(m_nLimitedDown);
	m_wndSpinUp.SetPos(m_nLimitedUp);

	UpdateData(FALSE);
	return FALSE;
}

void CScheduleItemDlg::OnOK() 
{
	UpdateData(TRUE);
	m_wndDate.SetTime(&m_tDateAndTime);
	m_wndTime.SetTime(&m_tDateAndTime);

	if (!(m_pwndTypeSel->GetCurSel() + 1))
	{
		AfxMessageBox(_T("Please select an event type."),MB_OK);
		return;
	}
	else
		m_nAction = m_pwndTypeSel->GetCurSel() + 1;


	if (m_pwndRadioOnce->GetCheck())
	{
		CTime tNow = CTime::GetCurrentTime();

		if (Scheduler.ScheduledTimePassed(&tNow,&m_tDateAndTime))
		{
			AfxMessageBox(_T("Scheduled time has already passed. \n\nPlease select a time in the future."),MB_OK);
			return;
		}
	}

	if (m_pwndActiveCheck->GetCheck())
		m_bActive = true;
	else
		m_bActive = false;

	if (m_pwndRadioOnce->GetCheck())
		m_bEveryDay = false;
	else
		m_bEveryDay = true;



	if(m_bNewItem)	m_pScheduleItem = new CScheduleItem();

	m_pScheduleItem->m_nLimited			= m_nLimited;
	m_pScheduleItem->m_nLimitedDown		= m_nLimitedDown;
	m_pScheduleItem->m_nLimitedUp		= m_nLimitedUp;
	m_pScheduleItem->m_bToggleBandwidth	= m_bToggleBandwidth;
	m_pScheduleItem->m_bLimitedNetworks	= m_bLimitedNetworks;

	
	m_pScheduleItem->m_tScheduleDateTime = m_tDateAndTime;
	m_pScheduleItem->m_bEveryDay		= m_bEveryDay;
	m_pScheduleItem->m_nAction			= m_nAction;
	m_pScheduleItem->m_sDescription		= m_sDescription;
	m_pScheduleItem->m_bActive			= m_bActive;
	m_wndDate.GetWindowText(m_pScheduleItem->m_sDate);
	m_wndTime.GetWindowText(m_pScheduleItem->m_sTime);
	m_pScheduleItem->m_bExecuted = false;

	if(m_bNewItem) Scheduler.Add(m_pScheduleItem);
	m_pScheduleItem = NULL;


	CSkinDialog::OnOK();
}

void CScheduleItemDlg::OnBnClickedOnlyonce()
{
	m_pwndRadioEveryDay->SetCheck(0);
	m_bEveryDay = false;

	m_wndDate.EnableWindow(true);
}

void CScheduleItemDlg::OnDtnDatetimechangeDate(NMHDR* /*pNMHDR*/, LRESULT *pResult)
{
	//LPNMDATETIMECHANGE pDTChange = reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);
	
	// Set the date part of the structure
	m_wndDate.GetTime(m_tTempDateTime);
	m_tDateAndTime = m_tTempDateTime;


	*pResult = 0;
}

void CScheduleItemDlg::OnDtnDatetimechangeTime(NMHDR* /*pNMHDR*/, LRESULT *pResult)
{
	//LPNMDATETIMECHANGE pDTChange = reinterpret_cast<LPNMDATETIMECHANGE>(pNMHDR);

	// Set the time part of the structure
	m_wndTime.GetTime(m_tTempDateTime);
	m_tDateAndTime = m_tTempDateTime;

	*pResult = 0;
}

void CScheduleItemDlg::OnBnClickedEveryday()
{
	m_pwndRadioOnce->SetCheck(0);

	m_wndDate.EnableWindow(false);
}

void CScheduleItemDlg::OnBnClickedToggleBandwidth()
{
	if(m_pwndLimitedCheck2->GetCheck())
	{
			m_pwndLimitedEdit->EnableWindow(false);
			m_pwndLimitedEditDown->EnableWindow(true);
			m_pwndLimitedEditUp->EnableWindow(true);
			m_wndSpin.EnableWindow(false);
			m_wndSpinDown.EnableWindow(true);
			m_wndSpinUp.EnableWindow(true);
			m_pwndLimitedStatic->EnableWindow(false);
			m_pwndLimitedStaticDown->EnableWindow(true);
			m_pwndLimitedStaticUp->EnableWindow(true);
	}
	else
	{
			m_pwndLimitedEdit->EnableWindow(true);
			m_pwndLimitedEditDown->EnableWindow(false);
			m_pwndLimitedEditUp->EnableWindow(false);
			m_wndSpin.EnableWindow(true);
			m_wndSpinDown.EnableWindow(false);
			m_wndSpinUp.EnableWindow(false);
			m_pwndLimitedStatic->EnableWindow(true);
			m_pwndLimitedStaticDown->EnableWindow(false);
			m_pwndLimitedStaticUp->EnableWindow(false);
	}
}

void CScheduleItemDlg::OnBnClickedActive()
{
	if (!m_pwndActiveCheck->GetCheck())
	{
		m_pwndActiveCheck->SetCheck(0);
	}
	else
	{
		m_pwndActiveCheck->SetCheck(1);
	}
}

void CScheduleItemDlg::OnCbnSelchangeEventtype()
{
	if (m_pwndTypeSel->GetCurSel() == 1)
		{
			if (!m_pwndLimitedCheck2->GetCheck())
			{
				m_pwndLimitedEdit->EnableWindow(true);
				m_wndSpin.EnableWindow(true);
			}
			else
			{
				m_pwndLimitedEditDown->EnableWindow(true);
				m_pwndLimitedEditUp->EnableWindow(true);
				m_wndSpinDown.EnableWindow(true);
				m_wndSpinUp.EnableWindow(true);				
			}
			m_pwndLimitedCheck2->EnableWindow(true);
			m_pwndLimitedCheck->EnableWindow(true);
			m_pwndLimitedStatic->EnableWindow(true);
			m_pwndLimitedStaticDown->EnableWindow(true);
			m_pwndLimitedStaticUp->EnableWindow(true);
		}
	else
	{
		m_pwndLimitedEdit->EnableWindow(false);
		m_pwndLimitedEditDown->EnableWindow(false);
		m_pwndLimitedEditUp->EnableWindow(false);
		m_wndSpin.EnableWindow(false);
		m_wndSpinDown.EnableWindow(false);
		m_wndSpinUp.EnableWindow(false);
		m_pwndLimitedCheck2->EnableWindow(false);
		m_pwndLimitedCheck->EnableWindow(false);
		m_pwndLimitedStatic->EnableWindow(false);
		m_pwndLimitedStaticDown->EnableWindow(false);
		m_pwndLimitedStaticUp->EnableWindow(false);
	}
}
