// DLG_MsgSetup.cpp : implementation file // #include "stdafx.h" #include "corpsms.h" #include "DLG_MsgSetup.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // DLG_MsgSetup dialog #include "MainFrm.h" #include "DLG_ZFUser.h" DLG_MsgSetup::DLG_MsgSetup(CWnd* pParent /*=NULL*/) : CDialog(DLG_MsgSetup::IDD, pParent) , m_strCorpID2(_T("")) { //{{AFX_DATA_INIT(DLG_MsgSetup) m_bCM = FALSE; m_strCM = _T(""); m_strCorpID = _T(""); m_strCorpName = _T(""); m_strCorpSmsUsed = _T(""); m_strCorpSmsNum = _T(""); m_bCorpZF = FALSE; m_strUserName = _T(""); m_strUserSmsNum = _T(""); m_strUserSmsUsed = _T(""); m_bUserZF = FALSE; m_strCorpSmsUsed2 = _T(""); m_bUserZF2 = FALSE; m_bUserZF3 = FALSE; m_strUserMmsUsed = _T(""); m_strOvrTime = _T(""); //}}AFX_DATA_INIT m_pMainFrame = (CMainFrame *)pParent; m_pSetup = NULL; m_pData = NULL; memset(&m_Setup,0,sizeof(m_Setup)); m_pNewData = NULL; m_pSeeAdd = NULL; // m_strKF_Name = _T(""); m_strKF_Mobile = _T(""); m_strKF_Name = _T(""); // m_strKF_S1 = _T(""); // m_strKF_Tel = _T(""); // m_strKF_Tel = _T(""); m_strKF_Tel = _T(""); m_strKF_Email = _T(""); } void DLG_MsgSetup::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(DLG_MsgSetup) DDX_Control(pDX, IDC_S_S1, m_S_S1); DDX_Control(pDX, IDC_MSGSETUP_LIST, m_wndUserList); DDX_Control(pDX, IDC_MSGSETUP_CORPLIST, m_wndCorpList); DDX_Check(pDX, IDC_MSGSETUP_BCM, m_bCM); DDX_Text(pDX, IDC_MSGSETUP_CM, m_strCM); DDV_MaxChars(pDX, m_strCM, 30); DDX_Text(pDX, IDC_MSGSETUP_CORPID, m_strCorpID); DDX_Text(pDX, IDC_MSGSETUP_CORPNAME, m_strCorpName); DDX_Text(pDX, IDC_MSGSETUP_CORPSMSUSED, m_strCorpSmsUsed); DDX_Text(pDX, IDC_MSGSETUP_CORPSMSNUM, m_strCorpSmsNum); DDX_Check(pDX, IDC_MSGSETUP_CORPZF, m_bCorpZF); DDX_Text(pDX, IDC_MSGSETUP_NAME, m_strUserName); DDX_Text(pDX, IDC_MSGSETUP_SMSNUM, m_strUserSmsNum); DDX_Text(pDX, IDC_MSGSETUP_SMSUSED, m_strUserSmsUsed); DDX_Check(pDX, IDC_MSGSETUP_ZF, m_bUserZF); DDX_Text(pDX, IDC_MSGSETUP_CORPSMSUSED2, m_strCorpSmsUsed2); DDX_Check(pDX, IDC_MSGSETUP_ZF2, m_bUserZF2); DDX_Check(pDX, IDC_MSGSETUP_ZF3, m_bUserZF3); DDX_Text(pDX, IDC_MSGSETUP_MMSUSED, m_strUserMmsUsed); DDX_Text(pDX, IDC_MSGSETUP_OVRTIME, m_strOvrTime); //}}AFX_DATA_MAP // DDX_Text(pDX, IDC_MSGSETUP_KF_EMAIL, m_strKF_Name); // DDX_Control(pDX, IDC_MSGSETUP_KF_EMAIL, m_strKF_Email); DDX_Text(pDX, IDC_MSGSETUP_KF_MOBILE, m_strKF_Mobile); DDX_Text(pDX, IDC_MSGSETUP_KF_NAME, m_strKF_Name); // DDX_Text(pDX, IDC_MSGSETUP_KF_TEL, m_strKF_S1); // DDX_Text(pDX, IDC_MSGSETUP_KF_TEL, m_strKF_Tel); // DDX_Text(pDX, IDC_MSGSETUP_KF_TEL, m_strKF_Tel); DDX_Text(pDX, IDC_MSGSETUP_KF_TEL, m_strKF_Tel); DDX_Text(pDX, IDC_MSGSETUP_KF_EMAIL, m_strKF_Email); DDX_Text(pDX, IDC_MSGSETUP_CORPID2, m_strCorpID2); } BEGIN_MESSAGE_MAP(DLG_MsgSetup, CDialog) //{{AFX_MSG_MAP(DLG_MsgSetup) ON_BN_CLICKED(IDC_MSGSETUP_CORPZF, OnMsgsetupCorpzf) ON_BN_CLICKED(IDC_MSGSETUP_ZF, OnMsgsetupZf) ON_BN_CLICKED(IDC_MSGSETUP_BCM, OnMsgsetupBcm) ON_NOTIFY(NM_DBLCLK, IDC_MSGSETUP_CORPLIST, OnDblclkMsgsetupCorplist) ON_NOTIFY(NM_RCLICK, IDC_MSGSETUP_CORPLIST, OnRclickMsgsetupCorplist) ON_NOTIFY(NM_DBLCLK, IDC_MSGSETUP_LIST, OnDblclkMsgsetupList) ON_NOTIFY(NM_RCLICK, IDC_MSGSETUP_LIST, OnRclickMsgsetupList) //}}AFX_MSG_MAP ON_COMMAND( ZF_CORP_ADD , On_Corp_Add ) ON_COMMAND( ZF_CORP_MODIFY, On_Corp_Modify ) ON_COMMAND( ZF_CORP_DEL , On_Corp_Del ) ON_COMMAND( ZF_CORP_CLEAR , On_Corp_Clear ) ON_COMMAND( ZF_USER_ADD , On_User_Add ) ON_COMMAND( ZF_USER_MODIFY, On_User_Modify ) ON_COMMAND( ZF_USER_DEL , On_User_Del ) ON_COMMAND( ZF_USER_CLEAR , On_User_Clear ) ON_BN_CLICKED(IDOK, &DLG_MsgSetup::OnBnClickedOk) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // DLG_MsgSetup message handlers BOOL DLG_MsgSetup::OnInitDialog() { CDialog::OnInitDialog(); // TODO: Add extra initialization here m_strCorpID.Format( _T("%d") , m_pSetup->lCorpID ); m_strCorpID2.Format(_T("%d"), m_pSetup->lCorpID); m_strCorpName = m_pSetup->szCorpName; m_strCorpSmsNum = m_pSetup->szCorpSMSNum; if (m_pSeeAdd) { COleDateTime tOvrDate(m_pSeeAdd->tOvr); if ( tOvrDate.GetStatus() == COleDateTime::valid ) m_strOvrTime.Format( _T("%04d.%02d.%02d") , m_pSeeAdd->tOvr.wYear,m_pSeeAdd->tOvr.wMonth,m_pSeeAdd->tOvr.wDay ); else m_strOvrTime = _T("无期限"); } /* #ifdef SMSCENTER_ADC GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2_S)->ShowWindow(SW_SHOW); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED_S)->SetWindowText(_T("ADC短信余额")); m_strCorpSmsUsed.Format( _T("%d") , m_pSetup->lCorpAdcSmsUsed ); m_strCorpSmsUsed2.Format( _T("%d") , m_pSetup->lCorpSmsUsed ); #else m_strCorpSmsUsed.Format( _T("%d") , m_pSetup->lCorpSmsUsed ); #endif */ #ifdef SUPPER_FUNC_MMS GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2_S)->ShowWindow(SW_SHOW); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2)->ShowWindow(SW_SHOW); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2_S)->SetWindowText(_T("可用彩信")); m_strCorpSmsUsed2.Format( _T("%d条") , m_pSetup->lCorpMmsUsed ); #endif m_strCorpSmsUsed.Format( _T("%d条") , m_pSetup->lCorpSmsUsed ); m_strUserName = m_pSetup->szUserName; if ( _tcslen(m_pSetup->szUserMobile)>0 ) { m_strUserName = m_strUserName + CString(_T("/"))+ CString(m_pSetup->szUserMobile); } m_strUserSmsNum = m_pSetup->szUserSMSNum; if ( m_pSetup->lUserSmsUsed == -100 ) m_strUserSmsUsed = _T("无限制"); else m_strUserSmsUsed.Format( _T("%d条") , m_pSetup->lUserSmsUsed ); #ifdef SUPPER_FUNC_MMS GetDlgItem(IDC_MSGSETUP_MMSUSED_S)->ShowWindow(SW_SHOW); GetDlgItem(IDC_MSGSETUP_MMSUSED)->ShowWindow(SW_SHOW); if ( m_pSetup->lUserMmsUsed == -100 ) m_strUserMmsUsed = _T("无限制"); else m_strUserMmsUsed.Format( _T("%d条") , m_pSetup->lUserMmsUsed ); #endif m_bCorpZF = m_pSetup->bCorpZF; m_bUserZF = (m_pSetup->bUserZF&SMSZF_ENABLE) >0; m_bUserZF2 = (m_pSetup->bUserZF&SMSZF_ONLYLIST) >0; m_bUserZF3 = (m_pSetup->bUserZF&SMSZF_LONGSMS) >0; m_bCM = m_pSetup->bCM; m_strCM = m_pSetup->szCM; m_strKF_Name = m_pSeeAdd->szKF_Name; m_strKF_Tel = m_pSeeAdd->szKF_Tel; m_strKF_Mobile = m_pSeeAdd->szKF_Mobile; m_strKF_Email = m_pSeeAdd->szKF_Email; #ifdef MOBSET_OEM GetDlgItem(IDC_MSGSETUP_KF_S1)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_KF_NAME)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_KF_TEL)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_KF_MOBILE)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_KF_EMAIL)->ShowWindow(SW_HIDE); #endif UpdateData( false ); OnMsgsetupCorpzf(); OnMsgsetupZf(); OnMsgsetupBcm(); HideGSetup(); //隐藏公用设置 if ( m_pMainFrame->m_ulPurviewType != PURVIEWTYPE_ADMIN ) //如果不是管理员,看不到企业的可用短信量 { GetDlgItem(IDC_MSGSETUP_CORPSMSUSED)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED_S)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2_S)->ShowWindow(SW_HIDE); GetDlgItem(IDC_MSGSETUP_CORPSMSUSED2)->ShowWindow(SW_HIDE); } //初始化List m_wndCorpList.SubClassWindow2(); m_wndCorpList.SetHeadings(_T("序号,60;姓 名,100;手机,150;")); m_wndCorpList.SetGridLines(true); m_wndUserList.SubClassWindow2(); m_wndUserList.SetHeadings(_T("序号,60;姓 名,100;手机,150;")); m_wndUserList.SetGridLines(true); TCHAR Buf[32]; if ( !m_pMainFrame->GetUserPurview(PURVIEW_SENDG,false) || !m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) { GetDlgItem( IDC_MSGSETUP_CORPZF )->EnableWindow(false); GetDlgItem( IDC_MSGSETUP_CORPLIST )->EnableWindow(false); } else { //显示转发列表 for ( int i=0;ilCorpZF;i++ ) { m_wndCorpList.InsertItem( i , _itot(i+1,Buf,10) , 0 ); m_wndCorpList.SetItemText( i , 1 , m_pData[i].szName ); m_wndCorpList.SetItemText( i , 2 , m_pData[i].szMobile ); } } if ( !m_pMainFrame->GetUserPurview(PURVIEW_RECVP,false) ) { GetDlgItem( IDC_MSGSETUP_ZF )->EnableWindow(false); GetDlgItem( IDC_MSGSETUP_LIST )->EnableWindow(false); } //显示转发列表 for ( int i=0;ilUserZF;i++ ) { m_wndUserList.InsertItem( i , _itot(i+1,Buf,10) , 0 ); m_wndUserList.SetItemText( i , 1 , m_pData[i+m_pSetup->lCorpZF].szName ); m_wndUserList.SetItemText( i , 2 , m_pData[i+m_pSetup->lCorpZF].szMobile ); } return TRUE; // return TRUE unless you set the focus to a control // EXCEPTION: OCX Property Pages should return FALSE } void DLG_MsgSetup::SetParam(ANS_MsgSetup_See *pSetup, ANS_MsgSetupData *pData) { m_pSetup = pSetup; m_pData = pData; } void DLG_MsgSetup::OnMsgsetupCorpzf() { CButton * pButton = (CButton*)GetDlgItem(IDC_MSGSETUP_CORPZF); if ( pButton->GetCheck() ) { GetDlgItem( IDC_MSGSETUP_CORPLIST )->EnableWindow(true); } else { GetDlgItem( IDC_MSGSETUP_CORPLIST )->EnableWindow(false); } } void DLG_MsgSetup::OnMsgsetupZf() { CButton * pButton = (CButton*)GetDlgItem(IDC_MSGSETUP_ZF); if ( pButton->GetCheck() ) { if ( _tcslen(m_pSetup->szUserSMSNum)<=_tcslen(m_pSetup->szCorpSMSNum) ) //没有设置用户特服号,不能设置转发 { MessageBox( _T("此用户没有设置特服号,不能设置转发!\r\n请先在公用通讯录里修改此用户的特服号。") , _T("提示"),MB_ICONINFORMATION ); pButton->SetCheck(false); return ; } GetDlgItem( IDC_MSGSETUP_LIST )->EnableWindow(true); } else { GetDlgItem( IDC_MSGSETUP_LIST )->EnableWindow(false); } } void DLG_MsgSetup::OnMsgsetupBcm() { CButton * pButton = (CButton*)GetDlgItem(IDC_MSGSETUP_BCM); if ( pButton->GetCheck() ) { GetDlgItem( IDC_MSGSETUP_CM )->EnableWindow(true); } else { GetDlgItem( IDC_MSGSETUP_CM )->EnableWindow(false); } } void DLG_MsgSetup::OnDblclkMsgsetupCorplist(NMHDR* pNMHDR, LRESULT* pResult) { On_Corp_Modify(); *pResult = 0; } void DLG_MsgSetup::OnRclickMsgsetupCorplist(NMHDR* pNMHDR, LRESULT* pResult) { ShowRCorpMenu(); *pResult = 0; } void DLG_MsgSetup::OnDblclkMsgsetupList(NMHDR* pNMHDR, LRESULT* pResult) { On_User_Modify(); *pResult = 0; } void DLG_MsgSetup::OnRclickMsgsetupList(NMHDR* pNMHDR, LRESULT* pResult) { ShowRUserMenu(); *pResult = 0; } void DLG_MsgSetup::ShowRCorpMenu() { if ( !m_pMainFrame->GetUserPurview(PURVIEW_SENDG,false) || !m_pMainFrame->GetUserPurview(PURVIEW_SENDP,false) ) //权限不够 return; CMenu menu; menu.CreatePopupMenu(); BOOL bLock = false; long lItem = this->GetCurrentSelected_Corp(); //添加 menu.AppendMenu(MF_STRING , ZF_CORP_ADD, _T(" 添加号码 ") ); //修改 if ( lItem >=0 ) { menu.AppendMenu(MF_STRING , ZF_CORP_MODIFY, _T(" 修 改 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , ZF_CORP_MODIFY , _T(" 修 改 ") ); } //删除 if ( lItem >=0 ) { menu.AppendMenu(MF_STRING , ZF_CORP_DEL, _T(" 删 除 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , ZF_CORP_DEL , _T(" 删 除 ") ); } menu.AppendMenu(MF_SEPARATOR ); //刷新 menu.AppendMenu(MF_STRING , ZF_CORP_CLEAR , _T(" 清空 ") ); //显示菜单 POINT pt ; ::GetCursorPos( &pt ); //this->ClientToScreen( &pt); menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL); menu.DestroyMenu(); } void DLG_MsgSetup::ShowRUserMenu() { if ( !m_pMainFrame->GetUserPurview(PURVIEW_RECVP,false) ) //权限不够 return; CMenu menu; menu.CreatePopupMenu(); BOOL bLock = false; long lItem = this->GetCurrentSelected_User(); //添加 menu.AppendMenu(MF_STRING , ZF_USER_ADD, _T(" 添加号码 ") ); //修改 if ( lItem >=0 ) { menu.AppendMenu(MF_STRING , ZF_USER_MODIFY, _T(" 修 改 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , ZF_USER_MODIFY , _T(" 修 改 ") ); } //删除 if ( lItem >=0 ) { menu.AppendMenu(MF_STRING , ZF_USER_DEL, _T(" 删 除 ") ); } else { menu.AppendMenu(MF_STRING|MF_DISABLED|MF_GRAYED , ZF_USER_DEL , _T(" 删 除 ") ); } menu.AppendMenu(MF_SEPARATOR ); //刷新 menu.AppendMenu(MF_STRING , ZF_USER_CLEAR , _T(" 清空 ") ); //显示菜单 POINT pt ; ::GetCursorPos( &pt ); //this->ClientToScreen( &pt); menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_RIGHTBUTTON,pt.x,pt.y, this, NULL); menu.DestroyMenu(); } long DLG_MsgSetup::GetCurrentSelected_Corp() { POSITION pos = m_wndCorpList.GetFirstSelectedItemPosition(); if ( pos ) { return m_wndCorpList.GetNextSelectedItem(pos); } return -1; } long DLG_MsgSetup::GetCurrentSelected_User() { POSITION pos = m_wndUserList.GetFirstSelectedItemPosition(); if ( pos ) { return m_wndUserList.GetNextSelectedItem(pos); } return -1; } void DLG_MsgSetup::On_Corp_Add() { ANS_MsgSetupData data={0}; DLG_ZFUser dlg(this); dlg.SetParam( data ); if ( dlg.DoModal() == IDOK ) { TCHAR Buf[32]; long lCount = m_wndCorpList.GetItemCount(); m_wndCorpList.InsertItem( lCount , _itot(lCount+1,Buf,10),0); m_wndCorpList.SetItemText( lCount,1 , dlg.GetParam().szName ); m_wndCorpList.SetItemText( lCount,2 , dlg.GetParam().szMobile ); } } void DLG_MsgSetup::On_Corp_Del() { long lItem = this->GetCurrentSelected_Corp(); if ( lItem < 0 ) return; m_wndCorpList.DeleteItem( lItem ); long lCount = m_wndCorpList.GetItemCount(); TCHAR szBuf[32]; for ( int i = 0 ; i< lCount;i++ ) { m_wndCorpList.SetItemText( i , 0 , _itot(i+1,szBuf,10) ); } } void DLG_MsgSetup::On_Corp_Modify() { long lItem = this->GetCurrentSelected_Corp(); if ( lItem < 0 ) return; ANS_MsgSetupData data={0}; m_wndCorpList.GetItemText( lItem , 1 , data.szName ,sizeof(data.szName)); m_wndCorpList.GetItemText( lItem , 2 , data.szMobile,sizeof(data.szMobile) ); DLG_ZFUser dlg(this); dlg.SetParam( data ); if ( dlg.DoModal() == IDOK ) { m_wndCorpList.SetItemText( lItem,1 , dlg.GetParam().szName ); m_wndCorpList.SetItemText( lItem,2 , dlg.GetParam().szMobile ); } } void DLG_MsgSetup::On_Corp_Clear() { m_wndCorpList.DeleteAllItems(); } void DLG_MsgSetup::On_User_Add() { ANS_MsgSetupData data={0}; DLG_ZFUser dlg(this); dlg.SetParam( data ); if ( dlg.DoModal() == IDOK ) { TCHAR Buf[32]; long lCount = m_wndUserList.GetItemCount(); m_wndUserList.InsertItem( lCount , _itot(lCount+1,Buf,10),0); m_wndUserList.SetItemText( lCount,1 , dlg.GetParam().szName ); m_wndUserList.SetItemText( lCount,2 , dlg.GetParam().szMobile ); } } void DLG_MsgSetup::On_User_Del() { long lItem = this->GetCurrentSelected_User(); if ( lItem < 0 ) return; m_wndUserList.DeleteItem( lItem ); long lCount = m_wndUserList.GetItemCount(); TCHAR szBuf[32]; for ( int i = 0 ; i< lCount;i++ ) { m_wndUserList.SetItemText( i , 0 , _itot(i+1,szBuf,10) ); } } void DLG_MsgSetup::On_User_Modify() { long lItem = this->GetCurrentSelected_User(); if ( lItem < 0 ) return; ANS_MsgSetupData data={0}; m_wndUserList.GetItemText( lItem , 1 , data.szName ,sizeof(data.szName)); m_wndUserList.GetItemText( lItem , 2 , data.szMobile,sizeof(data.szMobile) ); DLG_ZFUser dlg(this); dlg.SetParam( data ); if ( dlg.DoModal() == IDOK ) { m_wndUserList.SetItemText( lItem,1 , dlg.GetParam().szName ); m_wndUserList.SetItemText( lItem,2 , dlg.GetParam().szMobile ); } } void DLG_MsgSetup::On_User_Clear() { m_wndUserList.DeleteAllItems(); } REQ_MsgSetup DLG_MsgSetup::GetParam() { return m_Setup; } void DLG_MsgSetup::HideGSetup() { CRect rectwnd; this->GetWindowRect( &rectwnd ); CRect rectS1; m_S_S1.GetWindowRect( &rectS1 ); rectwnd.right = rectS1.left; this->MoveWindow( rectwnd ); this->CenterWindow(); } void DLG_MsgSetup::SetParam2(ANS_MsgSetup_SeeAdd *pSeeAdd) { m_pSeeAdd = pSeeAdd; } void DLG_MsgSetup::OnBnClickedOk() { UpdateData(true); if ( m_bCM ) { if ( m_strCM.GetLength() <= 0 ) { MessageBox( _T("签名内容不能为空,请输入!") , _T("错误") , MB_ICONWARNING ); GetDlgItem( IDC_MSGSETUP_CM )->SetFocus(); return ; } } m_Setup.lCorpID = m_pSetup->lCorpID; m_Setup.lUserID = m_pSetup->lUserID; m_Setup.bCM = m_bCM; _tcscpy( m_Setup.szCM , m_strCM ); m_Setup.bCorpZF = m_bCorpZF; m_Setup.bUserZF = m_bUserZF; if ( m_bUserZF2 ) m_Setup.bUserZF = m_Setup.bUserZF | SMSZF_ONLYLIST; if ( m_bUserZF3 ) m_Setup.bUserZF = m_Setup.bUserZF | SMSZF_LONGSMS; m_Setup.lCorpZF = m_wndCorpList.GetItemCount(); m_Setup.lUserZF = m_wndUserList.GetItemCount(); m_pNewData = new ANS_MsgSetupData[m_Setup.lCorpZF+m_Setup.lUserZF]; memset( m_pNewData , 0 , sizeof(ANS_MsgSetupData)*(m_Setup.lCorpZF+m_Setup.lUserZF) ); //取企业转发资料 for ( int i = 0 ; i