#!/usr/bin/env python

# Copyright (c) 2003 Aaron Redzik 
#
# This program 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.
# 
# This program 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 this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

		
print "Please wait, loading..."

import sys
import wx, gettext
try: from wxPython.wx import *
except:
	print "You do not appear to have wxPython installed, or it is not\n" \
		"installed properly.\n" \
		"Please download and install wxPython from http://www.wxpython.org"
	sys.exit()
import os, re, time

# Lav: Fix from 21.05.2006. See http://wiki.wxpython.org/index.cgi/Internationalization for details
# Hack to get the locale directory
basepath = os.path.abspath(os.path.dirname(sys.argv[0]))
localedir = os.path.join(basepath, "locale")
langid = wx.LANGUAGE_DEFAULT    # use OS default; or use LANGUAGE_JAPANESE, etc.
domain = "wxdialer"

# Set locale for wxWidgets
mylocale = wx.Locale(langid)
mylocale.AddCatalogLookupPathPrefix(localedir)
mylocale.AddCatalog(domain)
# Set up Python's gettext
mytranslation = gettext.translation(domain, localedir,
    [mylocale.GetCanonicalName()], fallback = True)
mytranslation.install()

#if wxLocale.GetSystemEncodingName() == "UTF-8" :
_ = wx.GetTranslation
print _("Please wait, loading...")

ver = "0.2.1"
HOME = os.environ["HOME"]
rootDir = os.path.join(HOME, ".wxDialer")
configFile = os.path.join(rootDir, "config")
modemrc = os.path.join(rootDir, ".modemrc")

ID_FILE_EXIT = 101
ID_FILE_ABOUT = 102
ID_FILE_CHECK = 103
ID_SETTINGS_EDIT = 201
ID_SETTINGS_VLOG = 202
ID_SETTINGS_SD = 203
ID_SETTINGS_MODEM = 204

class MyFrame(wxFrame):
	def __init__(self, parent, ID, title):
		wxFrame.__init__(self, parent, ID, title, wxDefaultPosition, wxSize(315,290))
		self.CreateStatusBar()
		self.SetStatusText(_("Welcome to wxDialer! Written by Aaron Redzik, 2003"))
	
		FILEmenu = wxMenu()
		SETTINGSmenu = wxMenu()
		
		FILEmenu.Append(ID_FILE_ABOUT, _("&About wxDialer"), _("About wxDialer"))
		FILEmenu.Append(ID_FILE_CHECK, _("&Check for updates"), _("Check for new versions of wxDialer"))
		FILEmenu.AppendSeparator()
		FILEmenu.Append(ID_FILE_EXIT, _("E&xit"), _("Terminate the program"))
		
		SETTINGSmenu.Append(ID_SETTINGS_SD, _("&Speed Dial"), _("Configure speed dial buttons"))
		SETTINGSmenu.Append(ID_SETTINGS_EDIT, _("&Edit settings"), _("Edit program settings"))
		SETTINGSmenu.Append(ID_SETTINGS_VLOG, _("&View logfile"), _("View wxDialer logfile"))
		SETTINGSmenu.Append(ID_SETTINGS_MODEM, _("&Modem settings"), _("Edit modem settings"))
		
		menuBar = wxMenuBar()
		menuBar.Append(FILEmenu, _("&File"));
		menuBar.Append(SETTINGSmenu, _("&Settings"));
		self.SetMenuBar(menuBar)
		
		EVT_MENU(self, ID_FILE_ABOUT, self.FileAbout)
		EVT_MENU(self, ID_FILE_CHECK, self.FileCheck)
		EVT_MENU(self, ID_FILE_EXIT, self.FileExit)
		EVT_MENU(self, ID_SETTINGS_SD, self.SettingsSD)
		EVT_MENU(self, ID_SETTINGS_EDIT, self.SettingsEdit)
		EVT_MENU(self, ID_SETTINGS_VLOG, self.SettingsVLog)
		EVT_MENU(self, ID_SETTINGS_MODEM, self.SettingsModem)

		self.lblname = wxStaticText(self, -1, _("Number to dial:"),wxPoint(5,5))
		self.logger = wxTextCtrl(self, 20, "", wxPoint(5, 22), wxSize(110, -1), wxTE_PROCESS_ENTER )
		self.logger.SetFocus()
		self.but_CLR = wxButton(self, 8, "C", wxPoint(120, 22), wxSize(22, 22))
		self.but_dial = wxButton(self, wxEVT_COMMAND_TEXT_ENTER, _("Dial"), wxPoint(5, 48), wxSize(140,-1))
		
		if len (sys.argv) == 3 and sys.argv[1] == "--phone":
			self.logger.AppendText(sys.argv[2])
		
		# Numeric keypad
		self.but_one = wxButton(self, 11, "1", wxPoint(18, 80), wxSize(30, 30))
		self.but_two = wxButton(self, 12, "2", wxPoint(58, 80), wxSize(30, 30))
		self.but_thr = wxButton(self, 13, "3", wxPoint(98, 80), wxSize(30, 30))
		self.but_for = wxButton(self, 14, "4", wxPoint(18, 120), wxSize(30, 30))
		self.but_fiv = wxButton(self, 15, "5", wxPoint(58, 120), wxSize(30, 30))
		self.but_six = wxButton(self, 16, "6", wxPoint(98, 120), wxSize(30, 30))
		self.but_sev = wxButton(self, 17, "7", wxPoint(18, 160), wxSize(30, 30))
		self.but_eig = wxButton(self, 18, "8", wxPoint(58, 160), wxSize(30, 30))
		self.but_nin = wxButton(self, 19, "9", wxPoint(98, 160), wxSize(30, 30))
		self.but_STA = wxButton(self, 22, "*", wxPoint(18, 200), wxSize(30, 30))
		self.but_zer = wxButton(self, 10, "0", wxPoint(58, 200), wxSize(30, 30))
		self.but_HAS = wxButton(self, 21, "#", wxPoint(98, 200), wxSize(30, 30))
		# SpeedDial buttons
		self.lblname = wxStaticText(self, -1, _("Speed Dial"),wxPoint(165,5))
		self.but_sd1 = wxButton(self, 1, setting.sd[1][0], wxPoint(165, 22), wxSize(140, -1))
		self.but_sd2 = wxButton(self, 2, setting.sd[2][0], wxPoint(165, 52), wxSize(140, -1))
		self.but_sd3 = wxButton(self, 3, setting.sd[3][0], wxPoint(165, 82), wxSize(140, -1))
		self.but_sd4 = wxButton(self, 4, setting.sd[4][0], wxPoint(165, 112), wxSize(140, -1))
		self.but_sd5 = wxButton(self, 5, setting.sd[5][0], wxPoint(165, 142), wxSize(140, -1))
		self.but_sd6 = wxButton(self, 6, setting.sd[6][0], wxPoint(165, 172), wxSize(140, -1))
		self.but_sd7 = wxButton(self, 7, setting.sd[7][0], wxPoint(165, 202), wxSize(140, -1))
		EVT_BUTTON(self, -1, self.ButtonPress)
		EVT_TEXT_ENTER(self,-1, self.ButtonPress)
	
	def ButtonPress(self, event):
		ToDial = self.logger.GetLineText(0)
		ID = event.GetId()
		if ID == 8:
			self.logger.Clear()
			return
		# some bug? it is should be identical codes
		if ID == wxEVT_COMMAND_TEXT_ENTER or ID == 20:
			if ToDial == "":
				wxLogError(_("There's nothing to dial!"))
			else:
				DialDialog(self, ["", ToDial])
		elif ID >= 10 and ID <= 19:
			self.logger.AppendText(str(ID)[-1])
		elif ID == 22:
			self.logger.AppendText("*")
		elif ID == 21:
			self.logger.AppendText("#")
		elif ID >= 1 and ID <=7:
			if setting.sd[ID][1] == "": 
				SpeedDialDialogInd(self, ID)
				self.SetButtonLabels(self)
			else: 
				DialDialog(self, setting.sd[ID])

	def FileAbout(self, event):
		dlg = wxMessageDialog(self, _("wxDialer - Version ")+ver+_("\n"
					"http://wxdialer.sourceforge.net\n"
					"\nWritten by Scrapz (aka Aaron Redzik)"),
					_("About"), wxOK | wxICON_INFORMATION)
		dlg.ShowModal()
		dlg.Destroy()
	
	def FileCheck(self, event):
		dlg1 = BusyDialog(self, _("Checking for updates\n" \
			"...contacting server..."))
		from httplib import HTTPConnection
		conn = HTTPConnection("wxdialer.sourceforge.net")
		try:
			conn.request("GET", "/version")
		except:
			print "Error contacting server"
			dlg1.close()
			wxLogError(_("There was an error contacting the server"))
			return
		dlg1.close()
		dlg1 = BusyDialog(self, _("Checking for updates\n" \
			"...checking for data..."))
		response = conn.getresponse()
		if response.status != 200:
			print "Error retrieving version data: %i" % response.status
			dlg1.close()
			wxLogError(_("Error retrieving version data: %i") % response.status)
			return
		dlg1.close()
		dlg1 = BusyDialog(self, _("Checking for updates\n" \
			"...retrieving data..."))
		data = response.read()
		data = data.rstrip()
		if data != ver:
			dlg = wxMessageDialog(self, _("There is a new version of wxDialer (")+data+_(")\n"
				"Please download it from:\n"
				"http://wxdialer.sourceforge.net/"),
				_("New version available"), wxOK | wxICON_INFORMATION)
		else:
			dlg = wxMessageDialog(self, _("You have the latest version of wxDialer\n"
				"Thank you for checking!"),
				_("No new version available"), wxOK | wxICON_INFORMATION)
		dlg1.close()
		dlg.ShowModal()

	def FileExit(self, event):
		dlg = wxMessageDialog(self, _("Are you sure you want to quit?"),
					"Quit", wxCANCEL | wxICON_QUESTION)
		x = dlg.ShowModal()
		dlg.Destroy()
		if x == wxID_OK: self.Close(true)
	
	def SettingsSD(self, event):
		SpeedDialDialogMain(self)
		self.SetButtonLabels(self)
		#SpeedDialDialogInd(self)

	def SettingsEdit(self, event):
		SettingsDialog(self)

	def SettingsVLog(self, event):
		ViewLogDialog(self)

	def SettingsModem(self, event):
		ModemSettingsDialog(self)

	def SetButtonLabels(self, event):
		self.but_sd1.SetLabel(setting.sd[1][0])
		self.but_sd2.SetLabel(setting.sd[2][0])
		self.but_sd3.SetLabel(setting.sd[3][0])
		self.but_sd4.SetLabel(setting.sd[4][0])
		self.but_sd5.SetLabel(setting.sd[5][0])
		self.but_sd6.SetLabel(setting.sd[6][0])
		self.but_sd7.SetLabel(setting.sd[7][0])

class MyApp(wxApp):
	def OnInit(self):
		frame = MyFrame(NULL, -1, "wxDialer v"+ver)
		frame.Show(true)
		self.SetTopWindow(frame)
		return true

class DialDialog(wxDialog):
	def __init__(self, parent, NameAndNumber):
		if not modem.exist:
			wxLogError(_("The device ")+setting.device+_(" does not exist.\n" \
				"Please change the device location in 'Edit settings'\n" \
				"under the 'Settings' menu. You will not be able to dial\n" \
				"out until this is fixed"))
			return
		Name = NameAndNumber[0]
		if Name != "": Name = "\""+Name+"\""
		Number = NameAndNumber[1]
		DialText = _("Dialing...\n\n")+Name+"\n"+Number
		wxDialog.__init__(self,parent,-1,_("Dialing..."),wxDefaultPosition,size=(150,150))
		self.parent = parent
		self.lbl1 = wxStaticText(self,-1,DialText,wxPoint(20,20))
		#self.lbl4 = wxStaticText(self,-1,"00:00:00",wxPoint(20,80))

		wxButton(self,wxID_OK,_("Hangup"),wxPoint(35,110),wxDefaultSize)
		if setting.mode == "Tone":
			blarg = modem.ToneDial
		else:
			blarg = modem.PulseDial
		print ""+blarg+NameAndNumber[1]
		modem.SendTo(""+blarg+NameAndNumber[1])
		if self.ShowModal() == wxID_OK:
			modem.SendTo("ATH0")

class ViewLogDialog(wxDialog):
	def __init__(self, parent):
		ID_SAVE = 100
		ID_CLEAR = 101
		wxDialog.__init__(self, parent, -1, "wxDialer Logfile", wxDefaultPosition, size=(400,185))
		self.parent = parent
		self.logger = wxTextCtrl(self,5, "",wxPoint(0,0), wxSize(400,135),wxTE_MULTILINE | wxTE_READONLY)
		self.butSAVE = wxButton(self, ID_SAVE, _("Save"), wxPoint(60,150))
		self.butCLOSE = wxButton(self, wxID_OK, _("Close"), wxPoint(160,150))
		self.butCLEAR = wxButton(self, ID_CLEAR, _("Clear"), wxPoint(260, 150))

		EVT_BUTTON(self, ID_SAVE, self.SaveLog)
		EVT_BUTTON(self, ID_CLEAR, self.ClearLog)
		self.Show()
	
	def SaveLog(self, event):
		text = "["+time.ctime()+"] - foo is j00!\n"
		self.logger.AppendText(text)

	def ClearLog(self, event):
		if self.logger.GetValue() == "": return
		dlg = wxMessageDialog(self, "Are you sure you want to clear the logfile?",
				"Clear logfile", wxCANCEL | wxICON_QUESTION)
		x = dlg.ShowModal()
		if x == wxID_OK:
			#file(setting.logFile, "w").close()
			self.logger.Clear()

	def _close():
		self.Destroy()

class Settings:
	def __init__(self):
		if not os.path.exists(rootDir):
			print "rootDir does not exist, creating..."
			os.mkdir(rootDir)
		if not os.path.exists(configFile):
			print "configFile does not exist, creating..."
			configData = "[Speed dial]\nsd1=(,)\nsd2=(,)\nsd3=(,)\nsd4=(,)\nsd5=(,)\nsd6=(,)\nsd7=(,)\n\n" \
				"[Last dialed]\nld1=\nld2=\nld3=\nld4=\nld5=\n\n" \
				"[Settings]\ndevice=/dev/modem\nlogfile="+os.path.join(HOME, ".wxDial/logfile")+"\nlogging=yes\nmode=Tone\nrate=115200"
			f = file(configFile, "w")
			f.write(configData)
			f.close()
		self.sd = []
		configData = []
		speedDialData = []
		lastDialedData = []
		f = file(configFile, "r")
		temp = f.readlines()
		f.close()
		for line in temp:
			configData.append(line.rstrip())
		for i in range(1,8):
			temp1 = configData[i].split("=")[1]
			if temp1 == "(,)":
				speedDialData.append(["", ""])
			else:
				temp2 = re.sub("\(", "", re.sub("\)", "", temp1)) 
				temp2 = temp2.split(",")
				speedDialData.append([temp2[0].rstrip(),re.sub(" ", "", temp2[1])])
		self.sd.append("")
		self.sd.append(speedDialData[0])
		self.sd.append(speedDialData[1])
		self.sd.append(speedDialData[2])
		self.sd.append(speedDialData[3])
		self.sd.append(speedDialData[4])
		self.sd.append(speedDialData[5])
		self.sd.append(speedDialData[6])
		for i in range(10,15):
			temp1 = configData[i].split("=")[1]
			if temp1 == "":
				lastDialedData.append("")
			else:
				temp2 = re.sub(" ", "", temp2.rstrip())
				lastDialedData.append(temp2)
		self.ld1 = lastDialedData[0]
		self.ld2 = lastDialedData[1]
		self.ld3 = lastDialedData[2]
		self.ld4 = lastDialedData[3]
		self.ld5 = lastDialedData[4]
		self.device = re.sub(" ", "", configData[17].split("=")[1])
		self.logFile = re.sub(" ", "", configData[18].split("=")[1])
		self.ifLog = re.sub(" ", "", configData[19].split("=")[1])
		self.mode = re.sub(" ", "", configData[20].split("=")[1])
		self.rate = re.sub(" ", "", configData[21].split("=")[1])
	
class SettingsDialog(wxDialog):
	def __init__(self, parent):
		self.changeOption = [setting.device, setting.ifLog, setting.mode, setting.rate]
		wxDialog.__init__(self,parent,-1,_("Settings"),wxDefaultPosition,size=(250,275))
		self.CentreOnParent()
		self.parent=parent
		self.deviceList = ["/dev/modem","/dev/ttyS0\t(com1)","/dev/ttyS1\t(com2)","/dev/ttyS2\t(com3)","/dev/ttyS3\t(com4)"]
		rb = wxRadioBox(self, 50, _("What device is the modem hooked up to?"), wxPoint(20,20), wxDefaultSize, self.deviceList, 1, wxRA_SPECIFY_COLS)
		temp = setting.device
		if temp == "/dev/modem":
			rbNum = 0
		elif temp == "/dev/ttyS0":
			rbNum = 1
		elif temp == "/dev/ttyS1":
			rbNum = 2
		elif temp == "/dev/ttyS2":
			rbNum = 3
		elif temp == "/dev/ttyS3":
			rbNum = 4
		rb.SetSelection(rbNum)
		self.lblMode = wxStaticText(self, -1, _("Dialing mode:"), wxPoint(20, 150))
		self.lstMode = ["Tone", "Pulse"]
		self.cboMode = wxComboBox(self, 51, "", wxPoint(20,170), wxSize(90, -1), self.lstMode, wxCB_DROPDOWN | wxTE_READONLY)
		self.cboMode.SetValue(self.lstMode[self.lstMode.index(setting.mode)])
		self.lblRate = wxStaticText(self, -1, _("Baud rate:"), wxPoint(135, 150))
		self.lstRate = ["9600", "19200", "38400", "57600", "115200", "230400"]
		self.cboRate = wxComboBox(self, 52, "", wxPoint(135, 170), wxSize(90, -1), self.lstRate, wxCB_DROPDOWN | wxTE_READONLY)
		self.cboRate.SetValue(self.lstRate[self.lstRate.index(setting.rate)])
		self.enableLogging = wxCheckBox(self, 40, "Enable logging",wxPoint(20,200))
		if setting.ifLog == "yes":
			self.enableLogging.SetValue(true)
		else:
			self.enableLogging.SetValue(false)
		wxButton(self,wxID_OK,_("Save"),wxPoint(35,230),wxDefaultSize).SetDefault()
		wxButton(self,wxID_CANCEL,_("Cancel"),wxPoint(135,230),wxDefaultSize)
		EVT_CHECKBOX(self, -1, self.CheckBoxLog)
		EVT_RADIOBOX(self, -1, self.RadioBoxDevice)
		EVT_COMBOBOX(self, 51, self.ComboMode)
		EVT_COMBOBOX(self, 52, self.ComboRate)
		x = self.ShowModal()
		if x == wxID_OK:
			setting.device = self.changeOption[0]
			setting.ifLog = self.changeOption[1]
			setting.mode = self.changeOption[2]
			setting.rate = self.changeOption[3]
			WriteConfig()
			modem.initialize()
	
	def CheckBoxLog(self, event):
		temp = event.Checked()
		if temp: self.changeOption[1] = "yes"
		else: self.changeOption[1] = "no"
	
	def RadioBoxDevice(self, event):
		temp = event.GetInt()
		if temp == 1: self.changeOption[0] = "/dev/ttyS0"
		elif temp == 2: self.changeOption[0] = "/dev/ttyS1"
		elif temp == 3: self.changeOption[0] = "/dev/ttyS2"
		elif temp == 4: self.changeOption[0]= "/dev/ttyS3"
		else: self.changeOption[0] = "/dev/modem"
	
	def ComboMode(self, event):
		temp = str(event.GetString())
		self.changeOption[2] = temp
	
	def ComboRate(self, event):
		temp = str(event.GetString())
		self.changeOption[3] = temp

class SpeedDialDialogMain(wxDialog):
	def __init__(self, parent):
		ID_CLEAR = wxNewId()
		self.current = ""
		# This next bit is a hack to get around a rather annoying bug
		# If its not a bug, then it bloody well should be!
		self.changeSD = []
		for i in range(0, len(setting.sd)):
			self.changeSD.append(setting.sd[i][:])
		# /bug
		wxDialog.__init__(self,parent,-1,_("Speed Dial"),wxDefaultPosition,size=(250,175))
		self.CentreOnParent()
		self.parent=parent
		self.sampleList = ["[Choose a button]","Speed Dial 1","Speed Dial 2","Speed Dial 3", \
				"Speed Dial 4","Speed Dial 5", \
				"Speed Dial 6","Speed Dial 7"]
		self.editSD = wxComboBox(self,10,"",wxPoint(10,10),wxSize(115,-1), self.sampleList, wxCB_DROPDOWN | wxTE_READONLY)
		self.butCLEAR = wxButton(self,ID_CLEAR,_("Clear"),wxPoint(135,10)) 
		self.butSAVE = wxButton(self,wxID_OK,_("Save"),wxPoint(35,125))
		self.butCANCEL = wxButton(self,wxID_CANCEL,_("Cancel"),wxPoint(135,125))
		self.lblName = wxStaticText(self,-1,_("Name:"),wxPoint(55,55))
		self.lblNumber = wxStaticText(self,-1,_("Number:"),wxPoint(45,90))
		self.editName = wxTextCtrl(self,20,"",wxPoint(95,50),wxSize(100,-1))
		self.editNumber = wxTextCtrl(self,21,"",wxPoint(95,85),wxSize(100,-1))
		EVT_COMBOBOX(self, 10, self.EvtComboBox)
		EVT_TEXT(self, 20, self.EvtTextName)
		EVT_TEXT(self, 21, self.EvtTextNumber)
		EVT_BUTTON(self, ID_CLEAR, self.ButClear)
		x = self.ShowModal()
		if x == wxID_OK:
			setting.sd = self.changeSD
			WriteConfig()
	
	def ButClear(self, event):
		temp = self.sampleList.index(self.current)
		self.changeSD[temp][0] = ""
		self.changeSD[temp][1] = ""
		self.editName.Clear()
		self.editNumber.Clear()

	def EvtTextName(self, event):
		if self.current == self.sampleList[0] \
			or self.current == "": return
		temp = str(event.GetString())
		if temp == self.sampleList[0] \
			or temp == "": return
		temp2 = self.sampleList.index(self.current)
		self.changeSD[temp2][0] = temp
	
	def EvtTextNumber(self, event):
		if self.current == self.sampleList[0] \
			or self.current == "": return
		temp = str(event.GetString())
		if temp == self.sampleList[0] \
			or temp == "": return
		temp2 = self.sampleList.index(self.current)
		self.changeSD[temp2][1] = temp
	
	def EvtComboBox(self, event):
		temp = event.GetString()
		if self.current == temp: return
		self.current = temp
		self.editName.Clear()
		self.editNumber.Clear()
		if temp != self.sampleList[0] and temp != "":
			temp2 = self.sampleList.index(temp)
			self.editName.AppendText(self.changeSD[temp2][0])
			self.editNumber.AppendText(self.changeSD[temp2][1])

class SpeedDialDialogInd(wxDialog):
	def __init__(self, parent, idnum):
		self.idnum = idnum
		self.changeSD = [setting.sd[idnum][0],""]
		self.valid = ["0","1","2","3","4","5","6","7","8","9","#","*"]
		wxDialog.__init__(self,parent,-1,_("Speed dial(")+str(idnum)+")",wxDefaultPosition,size=(195,165))
		self.CentreOnParent()
		self.parent=parent
		self.lblName = wxStaticText(self, -1, _("Name:"),wxPoint(25,10))
		self.editName = wxTextCtrl(self, 20, "", wxPoint(25, 30), wxSize(140,-1))
		self.editName.AppendText(setting.sd[idnum][0])
		self.lblNumber = wxStaticText(self, -1, _("Number to dial:"),wxPoint(25,55))
		self.editNumber = wxTextCtrl(self, 21, "", wxPoint(25, 75), wxSize(140,-1))
		wxButton(self,wxID_OK,("Save"),wxPoint(10,120), wxDefaultSize).SetDefault()
		wxButton(self,wxID_CANCEL,_("Cancel"),wxPoint(100,120),wxDefaultSize)
		#EVT_BUTTON(self,wxID_OK,self.ButSave)
		EVT_TEXT(self, -1, self.EvtText)
		x = self.ShowModal()
		if x == wxID_OK:
			if self.changeSD[0].rstrip() == "":
				self.changeSD[0] = self.changeSD[1]
			setting.sd[self.idnum][0] = self.changeSD[0].rstrip()
			setting.sd[self.idnum][1] = self.changeSD[1].rstrip()
			WriteConfig()
		self.Destroy()
	
	def EvtText(self, event):
		temp = str(event.GetString())
		temp2 = event.GetId()
		if temp2 == 20: self.changeSD[0] = temp
		else: self.changeSD[1] = temp

class ModemSettingsDialog(wxDialog):
	def __init__(self, parent):
		ID_DEFAULTS = wxNewId()
		wxDialog.__init__(self, parent, -1, "Modem settings", wxDefaultPosition, size=(375, 200))
		self.CentreOnParent()
		self.parent = parent
		self.lblInit = wxStaticText(self, -1, "Init:", wxPoint(10,15))
		self.txtInit = wxTextCtrl(self, 10, modem.Init, wxPoint(80,10), wxSize(90,-1))
		self.lblSPKon = wxStaticText(self, -1, "Speaker on:", wxPoint(10,50))
		self.txtSPKon = wxTextCtrl(self, 11, modem.SPKon, wxPoint(80, 45), wxSize(90,-1))
		self.lblToneDial = wxStaticText(self, -1, "Tone dial:", wxPoint(10,85))
		self.txtToneDial = wxTextCtrl(self, 12, modem.ToneDial, wxPoint(80,80), wxSize(90,-1))
		self.lblHangup = wxStaticText(self, -1, "Hangup:", wxPoint(195,15))
		self.txtHangup = wxTextCtrl(self, 13, modem.Hangup, wxPoint(265,10), wxSize(90,-1))
		self.lblSPKoff = wxStaticText(self, -1, "Speaker off:", wxPoint (195,50))
		self.txtSPKoff = wxTextCtrl(self, 14, modem.SPKoff, wxPoint(265, 45), wxSize(90,-1))
		self.lblPulseDial = wxStaticText(self, -1, "Pulse dial:", wxPoint(195,85))
		self.txtPulseDial = wxTextCtrl(self, 15, modem.PulseDial, wxPoint(265,80), wxSize(90,-1))
		self.lblMSG = wxStaticText(self, -1, "If your modem requires " \
			"a special AT string, enter\n" \
			"            it here, otherwise use the defaults." \
			, wxPoint(70,120))
		self.butSave = wxButton(self, wxID_OK, "Save", wxPoint(40,165), wxDefaultSize) 
		self.butDefaults = wxButton(self, ID_DEFAULTS, "Default", wxPoint(150,165), wxDefaultSize)
		self.butCancel = wxButton(self, wxID_CANCEL, "Cancel", wxPoint(260,165), wxDefaultSize)
		EVT_BUTTON(self, ID_DEFAULTS, self.RevertDefault)
		x = self.ShowModal()
		if x == wxID_OK:
			self.SaveChanges()
	
	def SaveChanges(self):
		modem.Init = self.txtInit.GetValue()
		modem.SPKon = self.txtSPKon.GetValue()
		modem.ToneDial = self.txtToneDial.GetValue()
		modem.Hangup = self.txtHangup.GetValue()
		modem.SPKoff = self.txtSPKoff.GetValue()
		modem.PulseDial = self.txtPulseDial.GetValue()
		modem.WriteConfig()

	def RevertDefault(self, event):
		self.txtInit.Clear()
		self.txtInit.AppendText(modem.def_Init)
		self.txtSPKon.Clear()
		self.txtSPKon.AppendText(modem.def_SPKon)
		self.txtToneDial.Clear()
		self.txtToneDial.AppendText(modem.def_ToneDial)
		self.txtHangup.Clear()
		self.txtHangup.AppendText(modem.def_Hangup)
		self.txtSPKoff.Clear()
		self.txtSPKoff.AppendText(modem.def_SPKoff)
		self.txtPulseDial.Clear()
		self.txtPulseDial.AppendText(modem.def_PulseDial)
	
class Modem:
	def __init__(self):
		self.def_Init = "+++ATZ"
		self.Init = self.def_Init 
		self.def_SPKon = "ATM1"
		self.SPKon = self.def_SPKon
		self.def_ToneDial = "ATDT"
		self.ToneDial = self.def_ToneDial
		self.def_Hangup = "ATH0"
		self.Hangup = self.def_Hangup
		self.def_SPKoff = "ATM0"
		self.SPKoff = self.def_SPKoff
		self.def_PulseDial = "ATDP"
		self.PulseDial = self.def_PulseDial
		if not os.path.exists(modemrc):
			print "modemrc does not exist, creating..."
			self.WriteConfig()
		self.ReadConfig()
		self.initialize()
	
	def initialize(self):
		if not os.path.exists(setting.device):
			self.exist = 0
			return
		else: self.exist = 1
		# Make sure the modem has hungup... just to be sure
		self.SendTo(self.Hangup)
		# '&F' reloads the factory defaults for the modem
		# '&W' stores those defaults as profile 0
		self.SendTo("AT&F&W")
		# '&D0' ignores the on-to-off transition of the DTR
		self.SendTo("AT&D0")
		# Make sure the speaker is on...
		self.SendTo(self.SPKon)
		self.SendTo(self.Hangup)
		# ...we're ready to rock!

	def WriteConfig(self):
		f = file(modemrc, "w")
		data = self.Init, self.SPKon, self.ToneDial, self.Hangup, self.SPKoff, self.PulseDial
		for thingy in data:
			f.write(thingy+"\n")
		f.close()
	
	def ReadConfig(self):
		f = file(modemrc, "r")
		data = f.readlines()
		f.close()
		self.Init = data[0].rstrip()
		self.SPKon = data[1].rstrip()
		self.ToneDial = data[2].rstrip()
		self.Hangup = data[3].rstrip()
		self.SPKoff = data[4].rstrip()
		self.PulseDial = data[5].rstrip()

	def SendTo(self,data):
		blarg = file(setting.device, "r+")
		blarg.write(data+"\n")
		blarg.close()

	
class BusyDialog(wxFrame):
	def __init__(self, parent, mess):
		wxFrame.__init__(self, parent, -1, "", wxDefaultPosition, wxSize(300,60), wxFRAME_FLOAT_ON_PARENT)
		self.CentreOnParent()
		p = wxPanel(self, -1, size = (300,60))
		wxStaticText(p ,-1, mess, wxPoint(200,40), style = wxALIGN_CENTER).CentreOnParent()
		self.Show(true)
		wxSafeYield()
	
	def close(self):
		self.Destroy()

def WriteConfig():
	configData = "[Speed dial]\nsd1=("+setting.sd[1][0]+","+setting.sd[1][1]+")\n" \
		"sd2=("+setting.sd[2][0]+","+setting.sd[2][1]+")\n" \
		"sd3=("+setting.sd[3][0]+","+setting.sd[3][1]+")\n" \
		"sd4=("+setting.sd[4][0]+","+setting.sd[4][1]+")\n" \
		"sd5=("+setting.sd[5][0]+","+setting.sd[5][1]+")\n" \
		"sd6=("+setting.sd[6][0]+","+setting.sd[6][1]+")\n" \
		"sd7=("+setting.sd[7][0]+","+setting.sd[7][1]+")\n" \
		"\n[Last dialed]\nld1="+setting.ld1+"\n" \
		"ld2="+setting.ld2+"\nld3="+setting.ld3+"\n" \
		"ld4="+setting.ld4+"\nld5="+setting.ld5+"\n" \
		"\n[Settings]\ndevice="+setting.device+"\n" \
		"logfile="+setting.logFile+"\n" \
		"logging="+setting.ifLog+"\n" \
		"mode="+setting.mode+"\n"+"rate="+setting.rate
	f = file(configFile, "w")
	f.write(configData)
	f.close()

setting = Settings()
modem = Modem()
app = MyApp(0)
app.MainLoop()

