rendered paste body#By: I-Vote Corporation
#Version: 0.13
#!/bin/sh
# the next line restarts using wish \
exec wish "$0" "$@"
package require sqlite3
#global variables
global zipList
global candidateList
global allElectionList
global electionSignal
global ballotSignal
global candidate
set ballotSignal 0
sqlite3 db ivote.db
#declare the prodcedure for Main Screen
proc mainMenuScreen {} {
#make the buttons
button .vote -text "Click to\n Vote" -command {reset;voterLoginScreen} -font defaultfont -justify center -background steelblue4 -foreground white
button .register -text "Click to\n Register" -command {reset;registrationScreen} -font defaultfont -justify center -background steelblue4 -foreground white
button .configuration -text "Configuration" -command {reset;configLoginScreen } -font labelfont -background steelblue4 -foreground white
#make the labels
label .welcome -text "Florida Electronic Voting Machine" -font titlefont -background lightsteelblue2
label .or -text "or" -font defaultfont -background lightsteelblue2
#display buttons
place .vote -relx 0.40 -rely 0.35 -relwidth 0.2
place .register -relx 0.40 -rely 0.52 -relwidth 0.2
place .configuration -relx 0.01 -rely 0.95
#display the labels
pack .welcome -anchor n
place .or -relx 0.491 -rely 0.459
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
#declare the procedure for Reset
proc reset {} {
foreach w [winfo children .] {
if {[winfo class $w] eq "Button"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Label"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Radiobutton"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Entry"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Spinbox"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Text"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Listbox"} {
destroy $w
}
}
foreach w [winfo children .] {
if {[winfo class $w] eq "Scrollbar"} {
destroy $w
}
}
}
#declare the procedure for config login
proc configLoginScreen {} {
#create labels
label .title -text "Configuration Login" -font titlefont -background lightsteelblue2
label .userName -text "User Name" -font defaultfont -background lightsteelblue2
label .passWord -text "Password" -font defaultfont -background lightsteelblue2
#create entry boxes
entry .userNameEntry -width 11 -font defaultfont -textvariable userName
entry .passWordEntry -width 11 -font defaultfont -show * -textvariable passWord
#creating buttons
button .submit -text "Submit" -font defaultfont -command {OfficialconfigcheckLogin $userName $passWord; unset userName; unset passWord} -background steelblue4 -foreground white
button .back -text "Back" -font defaultfont -command {reset;mainMenuScreen} -background steelblue4 -foreground white
#display objects etc
pack .title -anchor n
place .userName -relx 0.30 -rely 0.30
place .passWord -relx 0.30 -rely 0.40
place .submit -relx .4 -rely .77 -relwidth 0.2
place .userNameEntry -relx 0.45 -rely 0.30
place .passWordEntry -relx 0.45 -rely 0.40
place .back -relx .02 -rely 0.91 -relwidth 0.15
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc OfficialconfigcheckLogin {userName passWord} {
if {[db exists {SELECT * FROM ElectionOfficial WHERE username = $userName AND passWord = $passWord}]} {
tk_messageBox -message "Login Sucessful" -type ok
reset
configScreen
} else {
set answer [tk_messageBox -message "Incorrect Username/Password. Try Agian?" -type yesno]
switch -- $answer {
yes { }
no {reset;mainMenuScreen}
}
}
}
#declare the procedure for Configuration
proc configScreen {} {
#create label
label .welcome -text "Election Configuration" -font titlefont -background lightsteelblue2
#create buttons
button .electTally -text "Election Tally" -font defaultfont -command {reset;tallyScreen} -background steelblue4 -foreground white
button .admConfig -text "Administration Configuration" -font defaultfont -command {reset;adminLoginScreen} -background steelblue4 -foreground white
button .removeVoter -text "Remove Voter" -font defaultfont -command {reset;removeVoterScreen} -background steelblue4 -foreground white
button .createElec -text "Create Election" -font defaultfont -command {reset;addElectionScreen} -background steelblue4 -foreground white
button .createBallot -text "Create Ballot" -font defaultfont -command {reset;set allElectionList {};createElectionList;createBallotScreen} -background steelblue4 -foreground white
button .shutDown -text "Shutdown" -font defaultfont -command shutDownCheck -background steelblue4 -foreground white
button .back -text "Back" -command {reset;mainMenuScreen} -font defaultfont -background steelblue4 -foreground white
#display label
pack .welcome -anchor n
#display buttons
place .electTally -relx 0.31 -rely 0.2 -relwidth 0.35
place .admConfig -relx 0.31 -rely 0.3 -relwidth 0.35
place .back -relx .02 -rely 0.91 -relwidth 0.15
place .removeVoter -relx 0.31 -rely 0.4 -relwidth 0.35
place .createElec -relx 0.31 -rely 0.5 -relwidth 0.35
place .createBallot -relx 0.31 -rely 0.6 -relwidth 0.35
place .shutDown -relx 0.31 -rely 0.7 -relwidth 0.35
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
#check to see if they really want to shut down
proc shutDownCheck {} {
set answer [tk_messageBox -message "Are you sure you want to Shutdown the Voting Software?" -type yesno -icon question]
switch -- $answer {
yes exit
no {reset;configScreen}
}
}
#procedure for remove voter screen
proc removeVoterScreen {} {
#create labels
label .title -text "Remove Voter" -font titlefont -background lightsteelblue2
label .ssn -text "Social Security Number:" -font defaultfont -background lightsteelblue2
label .voterInfo -text "Voter Information:" -font defaultfont -background lightsteelblue2
label .name -text "Name:" -font defaultfont -background lightsteelblue2
label .address -text "Address:" -font defaultfont -background lightsteelblue2
entry .ssnText1 -font defaultfont -width 3 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<4}} -textvariable SSN1
entry .ssnText2 -font defaultfont -width 2 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<3}} -textvariable SSN2
entry .ssnText3 -font defaultfont -width 4 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<5}} -textvariable SSN3
#create buttons
button .back -text "Back" -command {reset; configScreen} -font defaultfont -background steelblue4 -foreground white
button .findVoter -text "Find Voter" -font defaultfont -command {findVoter $SSN1 $SSN2 $SSN3} -background steelblue4 -foreground white
button .deleteVoter -text "Delete Voter" -font defaultfont -command {deleteVoter $SSN1 $SSN2 $SSN3} -background steelblue4 -foreground white
#display labels
pack .title -anchor n
place .ssn -relx .1 -rely .2
place .ssnText1 -relx .4 -rely .2
place .ssnText2 -relx .48 -rely .2
place .ssnText3 -relx .55 -rely .2
place .voterInfo -relx .1 -rely .4
place .name -relx .24 -rely .5
#place .nameText -relx .34 -rely .5
place .address -relx .22 -rely .6
#place .addressText -relx .3 -rely .6
#display buttons
place .back -relx .3 -rely 0.9 -relwidth .2
place .findVoter -relx .65 -rely .18
place .deleteVoter -relx .53 -rely .9 -relwidth .2
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc findVoter {SSN1 SSN2 SSN3} {
if {[db exists {SELECT * FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3}]} {
db eval {SELECT * FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3} {
set votername [concat $FirstName $SuffixName $MiddleName $LastName]
set voteraddress [concat $Street $Apt $City $State]
label .addressText -text $voteraddress -font confirmfont -background lightsteelblue2
label .nameText -text $votername -font confirmfont -background lightsteelblue2
place .nameText -relx .33 -rely .502
place .addressText -relx .33 -rely .604
}
} else {
tk_messageBox -message "Voter doesn't exist" -type ok
}
}
proc deleteVoter {SSN1 SSN2 SSN3} {
destroy .nameText
destroy .addressText
if {[db exists {SELECT * FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3}]} {
db eval {DELETE FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3} {
tk_messageBox -message "Voter Deleted" -type ok
label .addressText -text "" -font confirmfont
label .nameText -text "" -font confirmfont
place .nameText -relx .34 -rely .5
place .addressText -relx .34 -rely .65
}
} else {
tk_messageBox -message "Voter doesn't exist" -type ok
}
}
#declare procedure for Add Election Screen
proc addElectionScreen {} {
global zipList
#create labels/buttons/etc
label .title -text "Add Election" -font titlefont -background lightsteelblue2
label .zipCode -text "Zipcode" -font defaultfont -background lightsteelblue2
label .startDate -text "Start Date" -font defaultfont -background lightsteelblue2
label .finishDate -text "Finish Date" -font defaultfont -background lightsteelblue2
label .electionName -text "Name of Election" -font defaultfont -background lightsteelblue2
entry .zipFirstText -font defaultfont -width 5 -textvariable zipFirst -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<6}}
spinbox .startMonthText -from 1 -to 12 -font defaultfont -width 2 -textvariable startMonth
spinbox .startDayText -from 1 -to 31 -font defaultfont -width 2 -textvariable startDay
spinbox .startYearText -from 2007 -to 2060 -font defaultfont -width 4 -textvariable startYear
spinbox .finishMonthText -from 1 -to 12 -font defaultfont -width 2 -textvariable finishMonth
spinbox .finishDayText -from 1 -to 31 -font defaultfont -width 2 -textvariable finishDay
spinbox .finishYearText -from 2007 -to 2060 -font defaultfont -width 4 -textvariable finishYear
entry .electionNameText -font defaultfont -width 16 -textvariable electionName
label .startTime -text "MM/DD/YY" -font labelfont -background lightsteelblue2
label .finishTime -text "MM/DD/YY" -font labelfont -background lightsteelblue2
listbox .zipList -height 7 -width 12 -font defaultfont -listvariable zipList -yscrollcommand \
".scroll set"
scrollbar .scroll -command {.zipList yview}
label .zipListText -text "List of Zip Codes for This Election" -font labelfont -background lightsteelblue2
button .back -text "Back" -command {reset; configScreen} -font defaultfont -background steelblue4 -foreground white
button .createElec -text "Create Election" -font defaultfont -command {reset;confirmElectionScreen \
$electionName $startMonth $startDay $startYear $finishMonth $finishDay $finishYear $zipList; } -background steelblue4 -foreground white
button .addZipCode -text "Add Zip Code" -font labelfont -command {addZipCodeBox $zipFirst; \
set zipFirst {};} -background steelblue4 -foreground white
#display label
pack .title -anchor n
place .zipCode -relx 0.23 -rely 0.55
place .startDate -relx 0.20 -rely 0.35
place .finishDate -relx .19 -rely .45
place .electionName -relx .13 -rely .25
place .zipFirstText -relx 0.34 -rely 0.55
place .startMonthText -relx .34 -rely .35
place .startDayText -relx .40 -rely .35
place .startYearText -relx .46 -rely .35
place .finishMonthText -relx .34 -rely .45
place .finishDayText -relx .40 -rely .45
place .finishYearText -relx .46 -rely .45
place .electionNameText -relx 0.34 -rely 0.25
place .startTime -relx .40 -rely .31
place .finishTime -relx .40 -rely .41
place .zipList -relx 0.64 -rely 0.25
place .zipListText -relx 0.617 -rely 0.223
place .scroll -relx 0.61125 -rely 0.2540 -relwidth 0.20 -relheight 0.278
#display buttons
place .back -relx .02 -rely 0.91 -relwidth 0.15
place .createElec -relx .35 -rely .7 -relwidth 0.3
place .addZipCode -relx 0.51 -rely 0.55
}
proc confirmElectionScreen {electionName startMonth startDay startYear finishMonth finishDay finishYear zipList} {
#create labels
label .title -text "Election Confirmation" -font titlefont -background lightsteelblue2
label .electionName -text "Name of Election" -font defaultfont -background lightsteelblue2
label .startDate -text "Start Date" -font defaultfont -background lightsteelblue2
label .finishDate -text "Finish Date" -font defaultfont -background lightsteelblue2
listbox .zipList -height 7 -width 12 -font defaultfont -listvariable zipList -yscrollcommand \
".scroll set"
scrollbar .scroll -command {.zipList yview}
label .zipListText -text "List of Zip Codes for This Election" -font labelfont -background lightsteelblue2
label .startTime -text "MM/DD/YY" -font messagefont -background lightsteelblue2
label .finishTime -text "MM/DD/YY" -font messagefont -background lightsteelblue2
#labels for variables
label .electionVar -text $electionName -font defaultfont -background lightsteelblue2
label .startDateLabel -text [concat $startMonth / $startDay / $startYear] -font defaultfont -background lightsteelblue2
label .finishDateLabel -text [concat $finishMonth / $finishDay / $finishYear] -font defaultfont -background lightsteelblue2
#create buttons
button .back -text "Back" -command {reset;addElectionScreen} -font defaultfont -background steelblue4 -foreground white
button .createElec -text "Confirm" -font defaultfont -command {electionConfirmed $electionName $startMonth $startDay \
$startYear $finishMonth $finishDay $finishYear $zipList; set electionName {}; set startMonth 1;set startDay 1;\
set startYear 2007; set zipList {}; set finishMonth 1; set finishDay 1; set finishYear 2007; reset; configScreen} -background steelblue4 -foreground white
#display label
pack .title -anchor n
place .startDate -relx 0.20 -rely 0.35
place .finishDate -relx .19 -rely .45
place .electionName -relx .13 -rely .25
place .startTime -relx .40 -rely .31
place .finishTime -relx .40 -rely .41
place .zipList -relx 0.64 -rely 0.25
place .zipListText -relx 0.617 -rely 0.223
place .scroll -relx 0.61125 -rely 0.2540 -relwidth 0.20 -relheight 0.278
#placing variables
place .startDateLabel -relx 0.34 -rely 0.35
place .finishDateLabel -relx 0.34 -rely 0.45
place .electionVar -relx 0.34 -rely 0.25
#display buttons
place .back -relx .02 -rely 0.91 -relwidth 0.15
place .createElec -relx .35 -rely .7 -relwidth 0.3
}
proc electionConfirmed {electionName startMonth startDay startYear finishMonth finishDay finishYear zipList} {
if {$startMonth < 10} {
set startMonth [concat 0$startMonth]
}
if {$startDay < 10} {
set startDay [concat 0$startDay]
}
if {$finishMonth < 10} {
set finishMonth [concat 0$finishMonth]
}
if {$finishDay < 10} {
set finishDay [concat 0$finishDay]
}
#finally makes the election in the database
db eval {Insert Into Election Values($electionName, $startMonth, $startDay,\
$startYear, $finishMonth, $finishDay, $finishYear)};
foreach z $zipList {
db eval {Insert Into ZipCodeList Values(NULL, $z, $electionName)}
}
}
proc addZipCodeBox {zipFirst} {
global zipList
tk_messageBox -message "Added Zip Code Sucessfully" -type ok
set zipList [concat $zipFirst $zipList]
}
#declare the procedure for config login
proc adminLoginScreen {} {
#create labels
label .title -text "Administration Login" -font titlefont -background lightsteelblue2
label .userName -text "UserName" -font defaultfont -background lightsteelblue2
label .passWord -text "Password" -font defaultfont -background lightsteelblue2
#create entry boxes
entry .userNameEntry -width 11 -font defaultfont -textvariable userName
entry .passWordEntry -width 11 -font defaultfont -show * -textvariable passWord
#creating buttons
button .submit -text "Submit" -font defaultfont -command {adminLoginScreenCheck $userName $passWord; unset userName; unset passWord} -background steelblue4 -foreground white
button .back -text "Back" -font defaultfont -command {reset;configScreen} -background steelblue4 -foreground white
#display objects etc
pack .title -anchor n
place .userName -relx 0.30 -rely 0.30
place .passWord -relx 0.30 -rely 0.40
place .submit -relx .4 -rely .77 -relwidth 0.2
place .userNameEntry -relx 0.45 -rely 0.30
place .passWordEntry -relx 0.45 -rely 0.40
place .back -relx .02 -rely 0.91 -relwidth 0.15
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc adminLoginScreenCheck {userName passWord} {
if {
[db exists {SELECT * FROM Administrator WHERE username = $userName AND passWord = $passWord}]
} then {
tk_messageBox -message "Login Sucessful" -type ok
reset
adminScreen
} else {
set answer [tk_messageBox -message "Incorrect Username/Password. Try Agian?" -type yesno]
switch -- $answer {
yes { }
no {reset;configScreen}
}
}
}
#declare procedure for Administrator Config
proc adminScreen {} {
#create label
label .welcome -text "Administration Configuration" -font titlefont -background lightsteelblue2
#create buttons
button .addRemoveEO -text "Add/Remove Election Official" -font defaultfont -command {reset;addRemoveEOScreen} -background steelblue4 -foreground white
button .exitDesktp -text "Exit to Desktop" -font defaultfont -command shutDownCheck -background steelblue4 -foreground white
button .back -text "Back" -command {reset;configScreen} -font defaultfont -background steelblue4 -foreground white
#display label
pack .welcome -anchor n
#display buttons
place .addRemoveEO -relx 0.31 -rely 0.3 -relwidth 0.4
place .exitDesktp -relx 0.31 -rely 0.4 -relwidth 0.4
place .back -relx .02 -rely 0.91 -relwidth 0.15
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
#declare procedure for Creating Ballot
proc createBallotScreen {} {
global candidateList
global allElectionList
#unsetting radiobutton if already set
set ballotType NULL
#create labels
label .title -text "Create Ballot" -font titlefont -background lightsteelblue2
label .selectElection -text "Select Election" -font defaultfont -background lightsteelblue2
listbox .listOfElectionText -font defaultfont -width 15 -listvariable allElectionList
label .ballotQuestion -text "Ballot Question" -font defaultfont -background lightsteelblue2
entry .ballotQuestionText -font defaultfont -width 16 -textvariable ballotQuestion
label .candidate -text "Candidate" -font defaultfont -background lightsteelblue2
entry .candidateText -font defaultfont -textvariable candidate
label .listOfCandidates -text "List of Candidates" -font labelfont -background lightsteelblue2
listbox .listOfCandidatesText -font defaultfont -listvariable candidateList -yscrollcommand \
".scroll set"
scrollbar .scroll -command {.listOfCandidatesText yview}
#create buttons
button .back -text "Back" -command {reset;configScreen} -font defaultfont -background steelblue4 -foreground white
button .addCandidate -text "Add Candidate" -font defaultfont -command {addCandidateBox $candidate; set candidate {};} -background steelblue4 -foreground white
button .addBallot -text "Add Ballot" -font defaultfont -command {set electionIndex [.listOfElectionText curselect]; \
set electionName [lindex $allElectionList $electionIndex]; submitBallotToDB $electionName $candidateList $ballotQuestion;} -background steelblue4 -foreground white
#display labels
pack .title -anchor n
place .selectElection -relx .12 -rely .22
place .listOfElectionText -relx .32 -rely .22 -relheight .3 -relwidth .3
place .ballotQuestion -relx .12 -rely .56
place .ballotQuestionText -relx .32 -rely .56 -relwidth .6
place .candidate -relx .12 -rely .69
place .candidateText -relx .32 -rely .69 -relwidth .27
place .listOfCandidates -relx .74 -rely .65
place .listOfCandidatesText -relx .63 -rely .68 -relheight .15 -relwidth .33
#display buttons
place .back -relx .02 -rely 0.91 -relwidth 0.15
place .addCandidate -relx .35 -rely .75 -relwidth .2
place .addBallot -relx .4 -rely .9 -relwidth .2
place .scroll -relx 0.759 -rely 0.68 -relwidth 0.20 -relheight 0.148
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc submitBallotToDB {electionName candidateList ballotQuestion} {
db eval {INSERT INTO Ballot VALUES(NULL, $ballotQuestion , $electionName)}
set ballotID [db eval {SELECT ballot_id FROM Ballot WHERE question = $ballotQuestion AND ballot_to_election = $electionName}]
foreach choice $candidateList {
db eval {INSERT INTO Choice VALUES(NULL, $choice , 0, $ballotID)}}
tk_messageBox -message "Ballot Sucessfully Added" -type ok
}
proc createElectionList {} {
global allElectionList
db eval {SELECT * FROM Election} {
lappend allElectionList $election_name
}
}
proc addCandidateBox {candidate} {
global candidateList
tk_messageBox -message "Added Candidate Sucessfully" -type ok
lappend candidateList $candidate
}
proc addElectionBox {} {
tk_messageBox -message "Sucessfully Added an Election" -type ok
reset
configScreen
}
#declare procedure for Graph Screen
proc tallyScreen {} {
#create labels
label .welcome -text "Election Tally" -font titlefont -background lightsteelblue2
#create buttons
button .continue -text "Click to Continue" -command {reset;configScreen} -font defaultfont -background steelblue4 -foreground white
#display buttons
place .continue -relx .75 -rely 0.91
pack .welcome -anchor n
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc voteControl {voter_id} {
global electionSignal
db eval {SELECT election_name FROM Election} {
set trueCount 0
if {[valididateDate4Election $election_name] == True} {
set trueCount [expr $trueCount + 1]
}
if {[validdiateZip4Election $election_name $voter_id] == True} {
set trueCount [expr $trueCount + 1]
}
#truecount analysis
if {$trueCount == 2} {
lappend electionList $election_name
}
}
if {[votedbefore $voter_id] == False} {
tk_messageBox -message "I'm sorry It appears that you have already voted" -type ok
} else {
foreach election $electionList {
voteScreen $election
vwait electionSignal
}
tk_messageBox -message "Thanks" -type ok
}
reset
tk_messageBox -message "Thank you for voting" -type ok
mainMenuScreen
}
proc votedbefore {voter_id} {
db eval {SELECT * FROM voter WHERE Voter_ID = $voter_id} {
if {$Voted == 0} {
return True
} else {
return False
}
}
}
proc validdiateZip4Election {election voter_id} {
db eval {SELECT ZipCode FROM ZipCodeList where zip_to_election = $election} {
db eval {SELECT Zip FROM Voter WHERE Voter_ID = $voter_id} {
if {$Zip == $ZipCode} {
return True
} else {
return False
}
}
}
}
proc valididateDate4Election {election} {
db eval {SELECT * FROM Election WHERE election_name = $election} {
set dayStart [clock format [clock scan [concat $startMonth/$startDay/$startYear]] -format "%m/%d/%Y"]
set dayEnd [clock format [clock scan [concat $finishMonth/$finishDay/$finishYear]] -format "%m/%d/%Y"]
set currentTime [clock format [clock scan "today"] -format "%m/%d/%Y"]
if {$dayStart <= $currentTime && $dayEnd >= $currentTime} {
return True
} else {
return False
}
}
}
#declare procedure for Vote Screen
proc voteScreen {election} {
global candidate
global ballotSignal
global electionSignal
global candidate
set ballotList [db eval {SELECT ballot_id FROM Ballot WHERE ballot_to_election = $election}]
foreach ballot $ballotList {
tk_messageBox -message "Ballot ID" -title $ballot -type ok
set choiceList [db eval {SELECT choice FROM Choice WHERE ballot_id = $ballot}]
set y 0.30
set ::candidate {}
foreach choice $choiceList {
radiobutton .choice_$choice -text $choice -variable candidate -value $choice -font defaultfont -background lightsteelblue2
place .choice_$choice -relx 0.15 -rely $y
set y [expr $y + 0.075]
}
db eval {SELECT question FROM Ballot WHERE ballot_id = $ballot} {
set ballot_question $question
}
radiobutton .choice_no_choice -text None -variable candidate -value None -font defaultfont -background lightsteelblue2
place .choice_no_choice -relx 0.15 -rely $y
#create labels
label .welcome -text "Vote" -font titlefont -background lightsteelblue2
label .question -text $ballot_question -font defaultfont -background lightsteelblue2
#create buttons
button .continue -text "Click to Continue" -font defaultfont -command "voteCheck $ballot" -background steelblue4 -foreground white
#display label
pack .welcome -anchor n
place .question -relx .09 -rely .2
#display buttons
place .continue -relx .75 -rely 0.91
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
vwait ballotSignal
}
tk_messageBox -message "Election Signal" -type ok
set electionSignal 1
}
proc voteCheck {ballot} {
global candidate
if {$candidate == {}} {
tk_messageBox -message "Please Cast a vote." -type ok
} elseif {$candidate == "None"} {
set answer [tk_messageBox -message "Are you sure you do not wish to vote in this election?" -type yesno]
switch -- $answer {
yes "reset; voteConfirmationScreen $ballot"
no { }
}
} else {
tk_messageBox -message "Vote Taken!" -type ok
reset
voteConfirmationScreen $ballot
}
}
#declare procedure for Vote Screen
proc voteConfirmationScreen {ballot} {
global candidate
global ballotSignal
#create labels
label .welcome -text "Voter Confirmation Screen" -font titlefont -background lightsteelblue2
label .check -text "Are you Sure you want to vote for:" -font defaultfont -background lightsteelblue2
#create buttons
button .continue -text "Confirm your Vote" -command "submitChoiceToDB $ballot; reset; set ballotSignal 1" -font defaultfont -background steelblue4 -foreground white
label .candiateSelection -text $candidate -font defaultfont -background lightsteelblue2
#display label
pack .welcome -anchor n
place .check -relx .09 -rely .2
#display buttons
place .continue -relx .75 -rely 0.91
place .candiateSelection -relx .15 -rely .4
#exit for testing
button .exit -text "Exit" -command {db close; exit} -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc submitChoiceToDB {ballot} {
global candidate
db eval {UPDATE Choice SET for_talley = for_talley + 1}
tk_messageBox -type ok -message [db eval {PRAGMA synchronous;}]
}
#declare procedure for Add/Remove Election Offical
proc addRemoveEOScreen {} {
set selection "None"
#create label
label .welcome -text "Add or Remove Election Official" -font titlefont -background lightsteelblue2
label .electOff -text "Select Add or Remove and fill in the approiate fields" -font defaultfont -background lightsteelblue2
label .userName1 -text "Username" -font defaultfont -background lightsteelblue2
label .userName2 -text "Username" -font defaultfont -background lightsteelblue2
label .passWord -text "Password" -font defaultfont -background lightsteelblue2
entry .usrName -font defaultfont -width 16 -textvariable userName
entry .pasWrd -font defaultfont -width 16 -show * -textvariable passWord
entry .usrName2 -font defaultfont -width 16 -textvariable userName
label .characters -text "Please note Password must be \n greater than 7 characters and \
\n must contain a combination of \n letters and numbers" -font labelfont -background lightsteelblue2
#create buttons
button .back -text "Back" -command {reset; adminScreen} -font defaultfont -background steelblue4 -foreground white
radiobutton .add -text "Add" -font defaultfont -variable selection -value "add" -background lightsteelblue2
radiobutton .remove -text "Remove" -font defaultfont -variable selection -value "remove" -background lightsteelblue2
button .submit -text "Submit" -font defaultfont -command {addRemoveEOCheck $selection $userName $passWord;set selection "None"} -background steelblue4 -foreground white
#display label
pack .welcome -anchor n
place .electOff -relx 0.2 -rely 0.2
place .userName1 -relx 0.07 -rely 0.45
place .usrName -relx 0.2 -rely 0.45
place .passWord -relx 0.07 -rely 0.55
place .pasWrd -relx 0.2 -rely 0.55
place .userName2 -relx 0.6 -rely 0.45
place .usrName2 -relx 0.72 -rely 0.45
place .characters -relx 0.2 -rely 0.6
#display buttons
place .back -relx .02 -rely 0.91 -relwidth 0.15
place .submit -relx .4 -rely .77 -relwidth 0.2
place .add -relx .14 -rely 0.3
place .remove -relx .75 -rely 0.3
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc addRemoveEOCheck {radio userName passWord} {
if {$radio == "add"} {
set answer [tk_messageBox -message "Add Election Offical?" -type yesno -icon question]
switch -- $answer {
yes {
tk_messageBox -message "Election Offical Added." -type ok
db eval {INSERT INTO ElectionOfficial VALUES(NULL, $userName, $passWord)}
}
no {}
}
} elseif {$radio == "remove"} {
set answer [tk_messageBox -message "Remove Election Offical?" -type yesno -icon question]
switch -- $answer {
yes {
tk_messageBox -message "Election Offical Removed." -type ok}
no {}
}
} else {
tk_messageBox -message "Please make a Selection." -type ok
}
}
#declare the procedure for Voter Registration
proc registrationScreen {} {
set zipInput {}
#creating text boxes for names
label .registarTitle -text "Voter Registration" -font titlefont -background lightsteelblue2
label .name -text Name -font defaultfont -background lightsteelblue2
label .lastNameLabel -text Last -font labelfont -background lightsteelblue2
entry .lastName -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable lastNameInput
label .suffixLabel -text Suffix -font labelfont -background lightsteelblue2
entry .suffix -font defaultfont -width 6 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<7}} -textvariable suffixNameInput
label .middleNameLabel -text Middle -font labelfont -background lightsteelblue2
entry .middleName -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable middleNameInput
label .firstNameLabel -text First -font labelfont -background lightsteelblue2
entry .firstName -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable firstNameInput
#placing text boxes for name
pack .registarTitle -anchor n
place .name -relx 0.1 -rely 0.25
place .lastNameLabel -relx 0.25 -rely 0.22
place .lastName -relx 0.185 -rely 0.25
place .suffixLabel -relx 0.382 -rely 0.22
place .suffix -relx 0.362 -rely 0.25
place .middleNameLabel -relx 0.52 -rely 0.22
place .middleName -relx 0.47 -rely 0.25
place .firstNameLabel -relx 0.71 -rely 0.22
place .firstName -relx 0.65 -rely 0.25
#creating objects for Social Security Number
label .ssn -text "Social Security Number" -font defaultfont -background lightsteelblue2
entry .ssnFirst -font defaultfont -width 3 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<4}} -textvariable ssn1Input
entry .ssnSecond -font defaultfont -width 2 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<3}} -textvariable ssn2Input
entry .ssnThird -font defaultfont -width 4 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<5}} -textvariable ssn3Input
#placing objects for Social Security Number
place .ssn -relx 0.1 -rely 0.33
place .ssnFirst -relx 0.40 -rely 0.33
place .ssnSecond -relx 0.467 -rely 0.33
place .ssnThird -relx 0.52 -rely 0.33
#creating objects for Address
label .address -text Address -font defaultfont -background lightsteelblue2
label .addyStreetLabel -text "Street Address" -font labelfont -background lightsteelblue2
entry .addyStreetText -font defaultfont -width 25 -textvariable streetInput
label .addyAptLabel -text "Apt/Lot/Unit" -font labelfont -background lightsteelblue2
entry .addyAptText -font defaultfont -width 11 -textvariable aptInput
label .addyCityLabel -text "City" -font labelfont -background lightsteelblue2
entry .addyCityText -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable cityInput
label .addyStateLabel -text "State" -font labelfont -background lightsteelblue2
entry .addyStateText -font defaultfont -width 3 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<3}} -textvariable stateInput
label .addyZipLabel -text "Zip Code" -font labelfont -background lightsteelblue2
entry .addyZipText -font defaultfont -width 5 -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<6}} -textvariable zipInput
#placing objects for Address
place .address -relx 0.1 -rely 0.42
place .addyStreetLabel -relx 0.31 -rely 0.39
place .addyStreetText -relx 0.20 -rely 0.42
place .addyAptLabel -relx 0.605 -rely 0.39
place .addyAptText -relx 0.57 -rely 0.42
place .addyCityLabel -relx 0.26 -rely 0.48
place .addyCityText -relx 0.20 -rely 0.51
place .addyStateLabel -relx 0.385 -rely 0.48
place .addyStateText -relx 0.38 -rely 0.51
place .addyZipLabel -relx 0.46 -rely 0.48
place .addyZipText -relx 0.455 -rely 0.51
#creating date of birth objects
label .dateOfBirth -text "Date of Birth" -font defaultfont -background lightsteelblue2
label .dateOfBirthMonthLabel -text "Month" -font labelfont -background lightsteelblue2
spinbox .dateOfBirthMonth -from 1 -to 12 -font defaultfont -width 2 -textvariable voterMonth
label .dateOfBirthDayLabel -text "Day" -font labelfont -background lightsteelblue2
spinbox .dateOfBirthDay -from 1 -to 31 -font defaultfont -width 2 -textvariable voterDay
label .dateOfBirthYearLabel -text "Year" -font labelfont -background lightsteelblue2
spinbox .dateOfBirthYear -from 1870 -to 2007 -font defaultfont -width 4 -textvariable voterYear
#placing objects for Date of Birth
place .dateOfBirth -relx 0.10 -rely 0.60
place .dateOfBirthMonth -relx 0.27 -rely 0.60
place .dateOfBirthMonthLabel -relx 0.27 -rely 0.574
place .dateOfBirthDay -relx 0.36 -rely 0.60
place .dateOfBirthDayLabel -relx 0.37 -rely 0.574
place .dateOfBirthYear -relx 0.47 -rely 0.60
place .dateOfBirthYearLabel -relx 0.49 -rely 0.574
#creating last couple objects
label .usQuestion -text "Are you a U.S. Citizen?" -font defaultfont -background lightsteelblue2
radiobutton .usYes -text "Yes" -variable Citizen -value yes -font defaultfont -background lightsteelblue2
radiobutton .usNo -text "No" -variable Citizen -value no -font defaultfont -background lightsteelblue2
label .felonQuestion -text "I affirm I am not a convicted felon, or if I am, my \
\n rights relating to voting have been restored." -font defaultfont -background lightsteelblue2
radiobutton .felonYes -text "Yes" -variable felon -value yes -font defaultfont -background lightsteelblue2
radiobutton .felonNo -text "No" -variable felon -value no -font defaultfont -background lightsteelblue2
button .submit -text "Submit Registration" -font defaultfont -command {reset; voterRegistrationCheck $Citizen $felon $ssn1Input $ssn2Input $ssn3Input $firstNameInput $suffixNameInput $middleNameInput $lastNameInput $streetInput $aptInput $cityInput $stateInput $zipInput $voterDay $voterMonth $voterYear} -background steelblue4 -foreground white
button .back -text "Back" -command {reset; mainMenuScreen} -font defaultfont -background steelblue4 -foreground white
#placing last couple of objects
place .usQuestion -relx 0.10 -rely 0.69
place .usYes -relx 0.38 -rely 0.685
place .usNo -relx 0.46 -rely 0.685
place .felonYes -relx 0.10 -rely 0.77
place .felonNo -relx 0.10 -rely 0.81
place .felonQuestion -relx 0.20 -rely 0.78
place .submit -relx .3 -rely .90 -relwidth 0.3
place .back -relx .02 -rely 0.91 -relwidth 0.15
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
#
proc confirmRegistrationScreen { ssn1Input ssn2Input ssn3Input firstNameInput suffixNameInput middleNameInput lastNameInput streetInput aptInput cityInput stateInput zipInput} {
#creating text boxes for names
label .registarTitle -text "Voter Registration Confirmation" -font titlefont -background lightsteelblue2
label .name -text "Name:" -font oldfont -background lightsteelblue2
label .lastName -text $lastNameInput -font confirmfont -background lightsteelblue2
label .suffix -text $suffixNameInput -font confirmfont -background lightsteelblue2
label .middleNameLabel -text Middle -font labelfont -background lightsteelblue2
label .middleName -text $middleNameInput -font confirmfont -background lightsteelblue2
label .firstNameLabel -text First -font labelfont -background lightsteelblue2
label .firstName -text $firstNameInput -font confirmfont -background lightsteelblue2
#placing text boxes for name
pack .registarTitle -anchor n
place .name -relx 0.297 -rely 0.33
place .lastName -relx 0.4 -rely 0.33
place .suffix -relx 0.53 -rely 0.33
place .middleName -relx 0.59 -rely 0.33
place .firstName -relx 0.7 -rely 0.33
#creating objects for Social Security Number
label .ssn -text "Social Security Number:" -font defaultfont -background lightsteelblue2
label .ssnFirst -text $ssn1Input -font confirmfont -background lightsteelblue2
label .ssnSecond -text $ssn2Input -font confirmfont -background lightsteelblue2
label .ssnThird -text $ssn3Input -font confirmfont -background lightsteelblue2
#placing objects for Social Security Number
place .ssn -relx 0.1 -rely 0.25
place .ssnFirst -relx 0.40 -rely 0.253
place .ssnSecond -relx 0.467 -rely 0.253
place .ssnThird -relx 0.52 -rely 0.2543
#creating objects for Address
label .address -text "Address:" -font defaultfont -background lightsteelblue2
label .addyStreetText -text $streetInput -font confirmfont -background lightsteelblue2
label .addyAptText -text $aptInput -font confirmfont -background lightsteelblue2
label .addyCityText -text $cityInput -font confirmfont -background lightsteelblue2
label .addyStateText -text $stateInput -font confirmfont -background lightsteelblue2
label .addyZipText -text $zipInput -font confirmfont -background lightsteelblue2
#placing objects for Address
place .address -relx 0.28 -rely 0.41
place .addyStreetText -relx 0.401 -rely 0.413
place .addyAptText -relx 0.7 -rely 0.413
place .addyCityText -relx 0.397 -rely 0.475
place .addyStateText -relx 0.57 -rely 0.475
place .addyZipText -relx 0.68 -rely 0.475
#creating last couple objects
button .edit -text "Edit" -font defaultfont -command {reset;registrationScreen} -background steelblue4 -foreground white
button .submit -text "Submit Information" -font defaultfont -command {reset;db eval {Insert Into Voter Values(NULL, $ssn1Input, $ssn2Input, $ssn3Input, $firstNameInput, $suffixNameInput, $middleNameInput, $lastNameInput, $streetInput, $aptInput, $cityInput, $stateInput, $zipInput, "no")}} -background steelblue4 -foreground white
#placing last couple of objects
place .edit -relx .02 -rely 0.91 -relwidth 0.15
place .submit -relx 0.73 -rely 0.91 -relwidth 0.25
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
#validating voter requirements
proc voterRegistrationCheck {citizen felon ssn1Input ssn2Input ssn3Input firstNameInput suffixNameInput middleNameInput lastNameInput streetInput aptInput cityInput stateInput zipInput voterDay voterMonth voterYear} {
set trueCount 0
if {[voterCitizenCheck $citizen] == true} {
set trueCount [expr $trueCount + 1]
}
if {[voterFelonCheck $felon] == true} {
set trueCount [expr $trueCount + 1]
}
if {[voterSSNcheck $ssn1Input $ssn2Input $ssn3Input] == true} {
set trueCount [expr $trueCount + 1]
}
if {[voterDOBcheck $voterDay $voterMonth $voterYear] == true} {
set trueCount [expr $trueCount + 1]
}
if {$trueCount == 4} {
confirmRegistrationScreen $ssn1Input $ssn2Input $ssn3Input $firstNameInput $suffixNameInput $middleNameInput $lastNameInput $streetInput $aptInput $cityInput $stateInput $zipInput
} else {
registrationScreen
}
}
proc voterCitizenCheck {citizen} {
if {$citizen == "yes"} {
return true
} elseif {$citizen == "no"} {
tk_messageBox -message "You must be a citizen to vote." -type ok
} else {
tk_messageBox -message "Please specify whether or not you are a citizen." -type ok
}
}
proc voterFelonCheck {felon} {
if {$felon == "yes"} {
return true
} elseif {$felon == "no"} {
tk_messageBox -message "Sorry, convicted felons are not allowed to vote in this state." -type ok
} else {
tk_messageBox -message "Please specify whether or not you are a felon." -type ok
}
}
proc voterSSNcheck {SSN1 SSN2 SSN3} {
if {[db exists {SELECT * FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3}]} {
db eval {SELECT * FROM Voter WHERE SSN1 = $SSN1 AND SSN2 = $SSN2 AND SSN3 = $SSN3}
tk_messageBox -message "A voter with that social security number already exists. Please check your registration information and ask an election official for assistance." -type ok
return false
} else {
return true
}
}
proc voterDOBcheck {voterDay voterMonth voterYear} {
if {$voterDay < 10} {
set voterDay [concat 0$voterDay]
}
if {$voterMonth < 10} {
set voterMonth [concat 0$voterMonth]
}
set currentTime [clock format [clock scan "today"] -format "%m/%d/%Y"]
set dob [clock format [clock scan [concat $voterMonth/$voterDay/$voterYear]] -format "%m/%d/%Y"]
if { [clock seconds] >= [clock scan {18 years} -base [clock scan $dob]] } {
return true
} else {
return false }
}
proc voterLoginScreen {} {
#creating new labels/buttons etc
button .mainMenu -text "Main Menu" -font defaultfont -command {reset;mainMenuScreen} -background steelblue4 -foreground white
label .loginTitle -text "Voter Login" -font titlefont -background lightsteelblue2
label .loginName -text "Name" -font defaultfont -background lightsteelblue2
label .firstNameLabel -text "First" -font labelfont -background lightsteelblue2
entry .firstNameText -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable voterFirstName
label .lastNameLabel -text "Last" -font labelfont -background lightsteelblue2
entry .lastNameText -font defaultfont -width 11 -validate key \
-vcmd {expr {[string is alpha %P] && [string length %P]<25}} -textvariable voterLastName
label .ssnLabel -text "SSN" -font defaultfont -background lightsteelblue2
label .ssnTextLabel -text "Social Security Number" -font labelfont -background lightsteelblue2
entry .ssnTextFirst -font defaultfont -width 3 -show * -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<4}} -textvariable voterSSNFirst
entry .ssnTextSecond -font defaultfont -width 2 -show * -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<3}} -textvariable voterSSNSecond
entry .ssnTextThird -font defaultfont -width 4 -show * -validate key \
-vcmd {expr {[string is int %P] && [string length %P]<5}} -textvariable voterSSNThird
button .login -text "Login" -font defaultfont -command {voterLoginScreenCheck $voterSSNFirst $voterSSNSecond $voterSSNThird $voterFirstName $voterLastName} -background steelblue4 -foreground white
label .or -text or -font defaultfont -background lightsteelblue2
button .modify -text "Modify" -font defaultfont -justify center -background steelblue4 -foreground white
#placing new labels/buttons etc
place .mainMenu -relx 0.02 -rely 0.91
pack .loginTitle -anchor n
place .loginName -relx 0.22 -rely 0.3
place .firstNameLabel -relx 0.37 -rely 0.27
place .firstNameText -relx 0.3 -rely 0.3
place .lastNameLabel -relx 0.57 -rely 0.27
place .lastNameText -relx 0.51 -rely 0.3
place .ssnLabel -relx 0.32 -rely 0.39
place .ssnTextFirst -relx 0.4 -rely 0.39
place .ssnTextSecond -relx 0.47 -rely 0.39
place .ssnTextThird -relx 0.525 -rely 0.39
place .ssnTextLabel -relx 0.42 -rely 0.36
place .login -relx 0.32 -rely 0.53 -relwidth 0.15
place .or -relx 0.48 -rely 0.545
place .modify -relx 0.515 -rely 0.53 -relwidth 0.15
#exit for testing
button .exit -text "Exit" -command exit -font defaultfont -background steelblue4 -foreground white
place .exit -relx 0.02 -rely 0.09
}
proc voterLoginScreenCheck {voterSSNFirst voterSSNSecond voterSSNThird voterFirstName voterLastName} {
db eval {SELECT * FROM Voter } {
if {$FirstName == $voterFirstName && $LastName == $voterLastName && $SSN1 == $voterSSNFirst && $SSN2 == $voterSSNSecond && $SSN3 == $voterSSNThird} {
tk_messageBox -message "Correct Password" -type ok
reset
voteControl $Voter_ID
} else {
tk_messageBox -message "Sorry, your name and Social Security Number does not appear to be registered. Try Again?" -type yesno
}
}
}
#creating a procedure incase there are ever any errors that reset to the mainMenu
#will work on some more
#proc unknown {} {
# {reset;mainMenuScreen}
#}
#starting Main
#setting up the main interface window
eval destroy [winfo child .]
wm geometry . [winfo screenwidth .]x[winfo screenheight .]+0+0 ;# sets to full screen
wm overrideredirect . yes ;# removes window decorations
wm attributes . -topmost yes ;# stays on top of other windows
. configure -background lightsteelblue2
#creating fonts to use
font create defaultfont -family Tahoma -size 25
font create titlefont -family Tahoma -size 60
font create labelfont -family Times -size 15
#calling the mainMenu procedure
mainMenuScreen