Cardinal voting is also known as Range voting. It is a better voting system than the one currently used in most of the world. It would result in fairer elections, better representing the opinion of the people.
More general information is available in the following web site: http://rangevoting.org/
See also: http://en.wikipedia.org/wiki/Range_voting
A drop-down selection box for each candidate, with 102 options: the numbers 0-99 for scoring purposes, an "X" for symbolizing a "non-vote" (does not affect the average for that candidate at all), and then a "Default" option (which should actually be the default). The voter will be allowed to specify (preferably right at the beginning) what that default value should be. The default option for that choice should probably be a "non-vote", giving the most meaningful election results from lazy voters, and still allowing them to choose the default to be a 0 or a 50, for example, should they want to.
You just collect a value from 0-99 (or a specification of a
"non-vote") from each user for each candidate. For every vote ballot,
you go through every scored candidate on it, and increment both the
total score by whatever that voter gave to the given candidate, as
well as incrementing the counter of the number of votes that candidate
has received. For an "X" (i.e. non-vote), you simply don't increment
either.
Once every ballot has been processed, you determine which candidate
received the greatest number of actual votes (numbers 0-99, not
non-votes or "X"). You then eliminate any candidates who did not
receive at least 25% of that number of real votes, and elect the
winner as the one with the highest average score (total score over
number of real votes) from the set of remaining candidates.
The module could either make use of the project Electowidget or by using the Drupal voting API.
The Electowidget solution would require more work, because Electowidget itself is not fully ready, but Cardinal Voting implementation with Electowidget would be reuseable with all php-based CMS on the web.
Another idea is to take Andrew Myers's public domain CIVS system, which
is a system that allows people on the internet to set up and conduct elections using
two Condorcet voting methods, and modify CIVS so that other voting methods
such as range voting are now made available. You can use CIVS by browsing to its
front page http://www.cs.cornell.edu/andru/civs.html
and you can download CIVS source code from http://www.cs.cornell.edu/w8/~andru/civs/changelog.html
Myers tells me that it will be fine with him to modify the CIVS code
long as it acknowledges him and is used for nonprofit purposes.
He believes it would be way easier to start from CIVS than
to rebuild it from the ground up. He suggests the following
for those who want to modify it to also support range voting:
To add range voting, you'd want to modify the "results" script to add a
radio button, and you'd need to write a module similar to "rp.pm" or
"beatpath.pm" that implements the range voting tallying. The results
script would then invoke your "range.pm" at corresponding points.
Unfortunately "results" is quite messy.
The http://rangevoting.org demos at
http://www.rangevoting.org/quickdemo/PresRadio.html
and
http://www.rangevoting.org/quickdemo/PresBallot.html
already implement range voting with a nice user interface (both nice
input, and nice output). You can copy the HTML of
the input and output (well, both would have to be produced by your codes)
to get something similarly nice.
But these demos are inadequate because they do not permit
users to create their OWN polls, and they do not prevent ballot box stuffing.
CIVS does those things using login IDs and all voters names are known for
each vote, but CIVS does not support range voting and really should be made
to support numerous voting systems.
Rangevoting.org does have a ballot-creator tool
http://www.rangevoting.org/MakeBal1.html
but it is only for paper ballots and is not connected to the
range voting demo system.
An even nicer user interface in some ways is at zohopolls:
http://zohopolls.com/brokenladder/2008-u-s-presidential-election-poll-using
which also permits users to make own polls.
In this area, implementing the actual vote-tallying itself is
easy. The hard part to program is the human interface stuff and the
prevention of ballot box stuffing stuff.
Contact Jan or Warren from http://rangevoting.org/ for more general information.
Contact Augustin for more technical information about Electowidget.