Click here to Skip to main content
Click here to Skip to main content

A Simple PHP Polling/Voting System

By , 11 Dec 2006
 

Sample Image - phpoll.gif

Introduction

This article will illustrate how to create a very simple, clean polling or voting system using PHP 5.0 and the DOMDocument object model. This allows the polling system to read and write polling results to XML, instead of say, a MySQL database like many conventional polling systems.

Background

I run a local music website, where, each month, I wanted to have my members vote on their favorite local band. The problem began with the fact that Joomla's default polling application logged IPs in cookies. So, all a person had to do was delete their cookies, and they could vote again. This was a very unfair system, and allowed for stuffing of the ballot boxes. So, I began combing the web in search of a third party component that could log IPs, and keep people from voting more than once a day.

After looking around for quite a while on the internet, I just couldn't find any solid component that would allow me to have 1) more than 10 voting items, and 2) log IPs to a database or a file to ensure people couldn't vote more than once a day. Those ones I could find that did what I needed were either incredibly slow, required an email sign-up (read: add me to a spam list), or, had all sorts of popup ads associated with their component.

Much chagrinned, I opted to knock the rust off of my PHP skills, and write my own. Now, those of you who have read my last articles realize that I'm a Microsoft guy, specializing in ASP.NET and C#. NOT PHP! But, I do have some experience with the language (and yes, I really do enjoy the simplicity/power of PHP), so, when reading this, please keep in mind that I am by no means a subject matter expert on PHP!

This poll is simple to deploy and configure, and hopefully will provide some level of use to you folks out there who just want to get a secure poll up and running in a short period of time!

Getting Started

Fortunately enough, all you need to run this polling system is PHP 5.0. This is a requirement, since the DOMDocument object is new to PHP 5. You do not need any sort of database system as this polling system utilizes simple file IO and XML.

If you want to skip the tutorial, I'll give you quickstart instructions below. If you want to know what's exactly going on in the program, keep reading!

Quick Installation

  • Create a directory for the poll to reside. This can be your root web directory if so desired.
  • Unzip the files included in the .zip file to the above directory.
  • CHMOD the addresses.xml and results.xml to 777 (in the /xml directory)
  • Open the results.xml file, and add your polling question, and an entry for each voting item.
  • Set the vote counts in the results.xml file to zero (or, whatever you'd like to start at).
  • Optional: Modify the poll.css file to fit your website's theme.
  • Access the poll at http://www.yoursite.com/yourpolldirectory/poll.php
  • That's it! Please note that there should be at least 1 address entry in the addresses.xml file (loopback of 127.0.0.1 is fine)

Once you access your poll, the poll.php screen will look something like the following:

The PHPoll Voting Page

After you vote, the results screen will look something like the following:

The PHPoll Results Page

Overview

The PHP Polling system is simple. It has 4 php files, 2 xml files, and a stylesheet. Technically, the user will only see two of those pages. They are outlined below.

  • Poll.php
    • Calls loadpoll.php to display the poll options
  • Results.php
    • Calls savevote.php to display the poll results

Loadpoll.php handles the display of the poll. How it handles this is simple.

  • Uses DOMDocument to load the results.xml file
  • Loops through all of the pollitem nodes to get the entries for the poll
  • Creates a radiobutton control for each item, and assigns the value to the particular entry
$doc = new DOMDocument();
$doc->load("xml/results.xml");
$root = $doc->getElementsByTagName("results")->item(0);
$question = $root->getAttribute("question");
$pollitems = $doc->getElementsByTagName("pollitem");
foreach( $pollitems as $pollitem )
{
  //Create a radio button...
}

We are basically just using the methods available to us in the DOMDocument object to loop through the nodes then emitting some HTML to account for our radiobutton controls. The last bit is to set a piece of JavaScript on the onclick event of the radiobutton. What this does is populate a hidden input field's text with the value of the vote. In this way, we can have a simple JavaScript confirm() dialog to ensure we have a value set. If not, we won't submit a vote. Once we set that value, and click "vote", the value of the form (action="savevote.php") posts the hidden value to savevote.php. The JavaScript functions are shown below.

function setVote(voteName)
{
  document.getElementById("votefor").value = voteName;
}

function confirmSubmit() 
{ 
  if (document.getElementById("votefor").value == "")
  {
    var agree=confirm("Please select an entry before voting."); 
    return false; 
  }
}

In PHP, POST and GET variables are loaded into the $_REQUEST global. So, in savevote.php we'll request the "votefor" value, which we've set in the poll.php page.

$votefor = $_REQUEST["votefor"];

Savevote.php is the largest file, and does the most work. The order of operations is outlined below:

  • Request the value of "votefor"
  • If we have a null value for $votefor, we just display the results.
  • Get the IP of the submitter using the $_SERVER["REMOTE_ADDR"] global
  • Load the addresses.xml file, and loop through to see if we have a matching IP address
    • If we have a match, we check the date of the last vote
      • If the date is today, we do not count the vote (user already voted)
      • If it's not today, we add one to the vote count (in results.xml), and set the last voted date to today
    • If we don't have a match, we add the new address node with the IP and today's date
  • Now that we've counted the vote (or not, as the case may be), we display our results.

Getting Fancy

Displaying the results could have been simple. A single line item with "Entry: xx votes" would have more than sufficed. But, I wanted to get clever. I like the idea of displaying a line graph, with the percentage of the votes inside the line graph. Now, you don't have to do this, but if you're interested in how this is done, read on.

Displaying a Line Graph

The first thing we'll need for the graph is the total number of votes. In the code, I get it like so:

// Get max vote count
$doc = new DOMDocument();
$doc->load("xml/results.xml");
$maxvotes = 0;
$pollitems = $doc->getElementsByTagName("pollitem");
foreach( $pollitems as $pollitem )
{
  $votes = $pollitem->getElementsByTagName("votes");
  $vote = $votes->item(0)->nodeValue;
  $maxvotes = $maxvotes + $vote;
}

Now that we have the max, we'll loop back through the results.xml file to calculate the percentages.

// Generate the results table
$doc = new DOMDocument();
$doc->load("xml/results.xml");
$pollitems = $doc->getElementsByTagName("pollitem");
foreach( $pollitems as $pollitem )
{
  $entries = $pollitem->getElementsByTagName("entryname");
  $entry = $entries->item(0)->nodeValue;
  $votes = $pollitem->getElementsByTagName("votes");
  $vote = $votes->item(0)->nodeValue;
  $tempWidth = $vote / $maxvotes;
  $tempWidth = 300 * $tempWidth;
  $votepct = round(($vote / $maxvotes) * 100);
  echo "<tr><td width=\"30%\" class=\"polls\">$entry</td>";
  echo "<td width=\"50%\" class=\"resultbar\"><div class=\"bar\" 
    style=\"background-color: ";
  getRandomColor();
  echo "; width: $tempWidth px;\">$votepct%</div></td><td width=\"20%\"
   ($vote votes)</td></tr>";
}

The way I did this simply was to create a table with three columns. The first column will hold the entry name, the second column will have the line graph with the percentage inside, and the last column will hold the total number of votes.

Creating the Graph

All I did to create the graph was to create a DIV object for each entry. I went on the basis that the max width of the DIV would be 300px. You can set this to whatever you like, just make sure it'll fit in the table and the page! So, to get the width of what the DIV should be, we'll just take the number of votes ($vote), divide it by the maximum count of votes ($maxvote), then multiply that percent value by 300. So, let's say we had 30 votes out of 100, 30/100 = .3, .3 * 300 = 90, the DIV would need to be 90 pixels wide. Then, to get the percentage (to put in the middle of the DIV), we just take $vote/$maxvote, round the value, and multiply by 100. Using the above example, this would give us 30%.

Coloring the Graph

Now, when we create each DIV, we know the width to make each one, and the %age value to put in the middle of the DIV. I thought it would be cool to create separate colors for each div, so I wrote a getRandomColor() function, and set the DIV's background-color style to whatever was returned by that function.

// Returns a random RGB color (used to color the vote bars)
function getRandomColor()
{
   $r = rand(128,255); 
   $g = rand(128,255); 
   $b = rand(128,255); 
   $color = dechex($r) . dechex($g) . dechex($b);
   echo "$color";
}

All we're doing now is getting a random value for the Red ($r), Green ($g) and Blue ($b) values using the PHP rand() function, then converting the decimal value to hex using the dechex() function. This will return us a color value formatted to hexadecimal, which the background-color will like.

Conclusion

So, in a couple of quick files, you can have a customized polling system on your own PHP 5.0 enabled web server. I was able to get this to execute in both IIS 5.1 and Apache without any problems. The nice part is that you don't need a database to house the logged IPs. In my experience, this system runs extremely fast using the DOMDocument object in PHP 5. You can see a demo of the functionality of this poll in a real-world application at www.jaxrock.com/poll/poll.php.

Good Luck, and Happy Coding!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

UsualDosage
Web Developer
United States United States
Member
I have been an ASP.NET/C# Programmer for about 7 years, specializing in business applications for financial institutions. I formerly wrote business applications for mortgage banking front-ends in C++ before switching to the .NET Framework, which I program in almost exclusively, now, except for my occasional contract dalliances in PHP and MySQL, which I really like. I especially enjoy graphic design, and web work.

In my spare time I run the local internet radio portal Jaxrockradio.com.

I have long moonlighted as an ANSI C programmer for several online MUDs (still a hobby of mine), and probably will continue to as long as they let me.

You can view my blog by visiting http://www.usualdosage.com.

My site design portfolio is located at http://design.usualdosage.com

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
BugHidden input needs id="votefor"memberMember 94157219 Sep '12 - 18:03 
Just thought I'd pass it along to anyone else who couldn't get this to work.
GeneralMy vote of 3memberXtremLucky22 Aug '12 - 19:26 
Good
Questionpolling systemmemberYawe Medi25 Jun '12 - 2:13 
I what a well develop php system that allows a user to vote ,like and dislike posts
QuestionJust doesnt work :( for mememberAsad Dhamani24 Jun '12 - 1:56 
This just doesnt work for me. Even if I vote, the votes just dont increase. Ok, and, what do I do if I want to remove the ip logging function? I want to be able to vote from one computer unlimited times.
QuestionJust doesnt work :(memberAsad Dhamani24 Jun '12 - 1:56 
This just doesnt work for me. Even if I vote, the votes just dont increase. Ok, and, what do I do if I want to remove the ip logging function? I want to be able to vote from one computer unlimited times.
QuestionCould buttons be used instead of radio buttonmemberTripar9 Mar '12 - 15:42 
I would LOVE to be able to use push-style buttons (text should be able to be edited) horizontally rather than radio buttons in a box.
 
Example button text: "Love It", "Hate It", etc...
 
Could this code be easily adjusted to accommodate push-style buttons?
 
Thank you in advance,
Trish

QuestionWeb Pollmemberprabhuganesan26 Dec '11 - 1:01 
Will the voting counts would be executed automaticaly ,when one starts voting or is it given default in the code
QuestionGreat poll but can the order of results be changedmemberMember 84657079 Dec '11 - 8:15 
Hi, this is great, but is there an easy way to have the results table display the votes in order of popularity rather than just the order they are entered in the XML file? Thanks!
GeneralReal nice article .. But.. [modified]membervkolgi15 May '11 - 19:52 
It's a real nice article. However how feasible is it to store the poll data in xml files?
If the website updates the poll every week or twice in a week the file eventually gets too big if stored in single file.
If say after six months we want to repeat the same polls for some weird reason it would be difficult to retrieve.
Considering the php script, this is definitely the best that I have seen for poll, but for storing I would still recommend mysql
database.. Smile | :)
Thanks,
Vinayak K.
Ya, I am a blogger too

QuestionCHMOD the addresses.xml and results.xml to 777 (in the /xml directory)?memberMember 779261028 Mar '11 - 9:17 
What exactly does CHMOD mean and telling me to do?...
AnswerRe: CHMOD the addresses.xml and results.xml to 777 (in the /xml directory)?membervkolgi15 May '11 - 19:56 
CHMOD is essentially a linux command which changes the permission of a file. Considering your host is a linux based one or supports the same command, 777 octal number changes the file permission to read, write, execute to everyone. This is usually done when we are editing a configuration file.
Vinayak Kolagi
www.funnyvinayak.wordpress.com

GeneralTop 3 votesmemberfurion_relic14 Sep '10 - 8:05 
I'm having a signature contest amongst friends and am going to let our clan members choose their 3 favorites, how can I impliment this into your code?
QuestionA little question...memberDanny Roman30 Aug '10 - 9:55 
First of all this is a great voting poll. It works great and it is very simple to use so THANKS to the author. Now a simple question. I changed the vote restriction from ip to user_id as i have a login system and i am getting the id with $domain = $_SESSION["user_id"];.Everything works perfect as i am getting the user id. But i want to store all the votes. Is it possible to store a new entry with the same id but different day instead of keeping the old entry and change only the date? For example if id 55 voted yesterday and voted today too can i have to entries, one with the date of yesterday and one with the date of today instead of just keeping one entry and update the date? That's because i want to log all the votes cause we want to give a prize for people who vote every day. I hope i made myself understood and sorry for my bad english Smile | :) And thanks in advance for possible replies!
GeneralMy vote of 5memberRussell Hancock8 Aug '10 - 8:23 
This code is exactly what I've been searching for. It seems easy enough for a non-programmer to do. Thanks!!
GeneralMy vote of 1memberselvol25 Apr '10 - 18:20 
Does not work for php 5.3 link to "working" poll does not worlk.
GeneralElection Software From Sequoia SourcememberEDAPerson4422 Oct '09 - 16:25 
Speaking of voting systems, you can take a look at the instructions here to see the source code to the Sequoia Voting Systems used by people in America to vote during elections!
 
This was received as a public record using Freedom of Information Act.
 
http://rapidshare.com/users/1GWJ4M[^]
GeneralJaxrock Voting Booth Errors: Help NeededmemberJiggus4 Apr '08 - 12:45 
Hi:
 
I just installed the files on my web directory as per directions, but upon trying to access the poll.php file, I get the following:
 
Header Text
 
Warning: DOMDocument::load() [function.DOMDocument-load]: I/O warning : failed to load external entity "/home/jiggus/public_html/xml/results.xml" in /home/jiggus/public_html/loadpoll.php on line 4
 
Fatal error: Call to a member function getAttribute() on a non-object in /home/jiggus/public_html/loadpoll.php on line 6
 
I have no idea what this is about. Can anyone help me, please?
 
Many thanks,
 
Jiggus
GeneralRe: Jaxrock Voting Booth Errors: Help NeededmemberUsualDosage7 Apr '08 - 11:12 
The easiest check is to make sure that results.xml has a chmod of at least 755. Set it to 777 right now for testing.
 
If it still doesn't work, check your PHP version and make sure it's up to date. I believe that the DOMDocument class is only functional with PHP5+.
 
Also, if you're running this on Ubuntu, here's a link that may help: http://ubuntuforums.org/showthread.php?t=256374[^]
 
Quae narravi nullo modo negabo.

General$_REQUEST["votefor"] is nullmemberrobert.tw20 May '07 - 21:14 
those vote messages never show up!
maybe it just because the $_REQUEST["votefor"] is null, therefore no matter how many times we try
the result.xml file dont change at all!
Anyone know why?D'Oh! | :doh:
GeneralRe: $_REQUEST["votefor"] is nullmemberMember 100277824 May '13 - 10:10 
I had this problem, and I figured out why it's happening. If you start out a poll as having 0 votes, that will happen. It's rather annoying, yet I guess if it's only one off that is no huge problem
Generalunable to connect PHP with Mysqlmemberbhavna81626 Apr '07 - 23:18 

 
I am new to PHP. I am trying to connect mysql with PHP with
mysql_connect but i m getting
"A link to the server could not be established"
I have used ODBC 3.51 driver for odbc and made connections with odbc with odbc_connect
but i don't know how to connect it with mysql_connect and fire mysql_-----queries.
Is there any specific driver for tht?

GeneralRe: unable to connect PHP with MysqlmemberUsualDosage5 Jul '07 - 2:31 
Sorry, that's pretty much outside the scope of this tutorial. You'll notice the demo does not use a SQL connection and instead uses an XML file to store results. AFAIK, and ODBC driver should work fine for MySQL.
 
Quae narravi nullo modo negabo.

AnswerRe: unable to connect PHP with Mysqlmemberrajhans8426 Jul '07 - 0:07 
Dear,
You need to configure your php.ini. To use connection to mysql you have to enable mysql extension in the php.ini file;
 
To enable Mysql support do the following :
1. First, ensure that you have mysql extension library present in your PHP version.
2. Locate the php.ini file which your current php installation using.To check this, make a new php file say phpinfo.php and put the following code in it:
" phpinfo();
?>"
Now save this file in your server's document directory e.g.HTDOCS.Now open the file in your browser.
http://localhost/phpinfo.php
in our case.
A configuration table of PHP will be opened.
Check this table for "Configuration File (php.ini) Path".
3. Open the file specified in the above found path.
4. Find a line containing the string
;extension=php_mysql.dll
;extension=php_mysqli.dll
5. Uncomment the above lines by removing ';' from begining.
6. Save the file and restart your server.
7. Mysql is ready to use with PHP.
 


 
Don't have a loan we can do it for you. Just try out our new home loan plans

GeneralNot working in Firefoxmemberallnameshavebeenregistered15 Feb '07 - 4:22 
It does not seem to work in Firefox, if you vote on it in firefox the result stays the same then if I go to Internet Explorer I can vote so it is not that I allready voted. Also the results in firefox are not shown as it should be http://img178.imageshack.us/img178/707/ffnb6.png do not know if it shows like this because there was no vote registered?

GeneralRe: Not working in Firefoxmemberrobert.tw21 May '07 - 15:51 
Same here! also in firefox the js doesn't work at all! and the vote count doesn't added on..pity~
GeneralRe: Not working in FirefoxmemberUsualDosage5 Jul '07 - 2:36 
Didn't check it in Firefox. This was meant to be a tutorial on using the DOMDocument in PHP. Since I use IE primarily, I wrote it for IE. Sorry it doesn't look the same in Firefox, but I'm sure with some very minor modifications it would.
 
Quae narravi nullo modo negabo.

GeneralRe: Not working in Firefoxmemberx0SiN0x27 Nov '07 - 10:29 
I know its been a while for this one, but I just found this script today and noticed the same problem - figured id chime in with a quick fix for others.
 
change
<input name="votefor" type="hidden"/>
 
to now include the id as well
<input id="votefor" name="votefor" type="hidden"/>
 
just a quick fix, if you do some research there is a more proper fix (hint: javascript function setVote) - but this will at least get it working.
 

 

 
great script by the way, I needed to add functionality to allow for an "other" option with input. But, other then that works well for what I needed without recreating the wheel.
GeneralRe: Not working in Firefoxmembermain5tream9 Nov '09 - 18:47 
To get the bars displaying properly in firefox you can edit savevote.php
 
echo "<td width=\"50%\" class=\"resultbar\"><div class=\"bar\"
      style=\"background-color: ";
   getRandomColor();
   echo "; width: $tempWidth px;\">$votepct%</div></td><td width=\"20%\"
   ($vote votes)</td></tr>";
 
can just be changed to;
 
echo "<td width=\"50%\" class=\"resultbar\"><div class=\"bar\"
      style=\"background-color: ";
   getRandomColor();
   echo "; width: $votepct%;\">$votepct%</div></td><td width=\"20%\"
   ($vote votes)</td></tr>";
 
so you're just using the vote percentage as the value to define the percentage rather than the tempWidth absolute value. Using this fix and the above one it looks like it works fine in both IE and Firefox Smile | :)
GeneralRe: Not working in FirefoxmemberDanny Roman2 Sep '10 - 1:11 
Hi there. I am trying to get to the author of this script but i can't. I want to mosify something and i saw that you are good with DOMDocuments? I want to do something like this: when a uesr votes the code is getting the ip address and the date. If a user votes again in the next day the code is just updating the date but i want something else. I want to log all the votes so if a user is voting again in the next day i want to make another field in the xml with the same ip and the date of that day. Do you know how can i make this possible? I am not good with DOMDocuments and PHP. If you know and if you can and want to help me i would be very grateful. Thanks in advance for the possible reply. I hope you understood what i am trying to achieve.
GeneralRe: Not working in FirefoxmemberUsualDosage2 Sep '10 - 3:10 
Danny: I don't work with PHP anymore, and really haven't since I wrote this roughly 4 years ago. If you need a free IP tracking PHP poll, I suggest you start here[^].
Quae narravi nullo modo negabo.

GeneralRe: Not working in FirefoxmemberDanny Roman2 Sep '10 - 3:24 
ok i understand. if you can't help me then no one can. looks like i'm stuck. i wanted to use your voting poll because in my opinion is the best and easiest to use. the problem is that i don't need an ip tracking system but i need an user_id tracking system and i sorted this with yours replacing $_SERVER["REMOTE_ADDR"] with $_SESSION["user_id"] and all i want to do now is log EVERY vote instead of just updating the date. well i guess i'm gonna let it go...thanks anyway for the reply
GeneralProblemmemberMatrixCoder4 Jan '07 - 5:08 
Great article, but there's a small problem. Every time someone clicks "vote", the results show, but the amount of votes (per entry and all together) don't change. I can't find the problem.
 
Any ideas? Thanks.
 




Trinity: Neo... nobody has ever done this before.
Neo: That's why it's going to work.

GeneralRe: ProblemmemberUsualDosage4 Jan '07 - 5:40 
That's not really a problem, more of a feature. The poll doesn't allow people to vote from the same IP address more than once per day. After their first vote for the day, clicking "Vote" will just transfer them to the results page, and will not actually calculate their vote until 24 hours has passed.
 
You will see a message like "You already voted once today." in the message when that happens.
 
If you'd like to see a working example, I have this in production (with over 1700 votes) at http://www.jaxrock.com/poll/poll.php[^].
 
Quae narravi nullo modo negabo.

GeneralRe: ProblemmemberMatrixCoder4 Jan '07 - 10:00 
Ok, let me put it this way. Nothing works. Voters just get sent to the results page (which doesn't have any votes on it). They don't even get a message saying that anyone has already voted. It just goes straight to the results.
 
Any ideas? Thanks!
 




Trinity: Neo... nobody has ever done this before.
Neo: That's why it's going to work.

GeneralRe: ProblemmemberUsualDosage4 Jan '07 - 10:09 
Only suggestion I have is to make sure that the two XML files are both CHMOD'ded to 777. This definitely sounds like a file permissions problem. Try that, and see if it works.
 
Also, it's important that you are running > PHP 5.0.
 
If you CHMOD the XML files, and you're running > 5.0 and it still doesn't work, I don't know what to tell ya! Sniff | :^)
 
Quae narravi nullo modo negabo.

GeneralRe: ProblemmemberMatrixCoder4 Jan '07 - 11:33 
Yes, I am running PHP 5.0. And what exactly do you mean by CHMOD to 777?
 




Trinity: Neo... nobody has ever done this before.
Neo: That's why it's going to work.

GeneralRe: ProblemmemberUsualDosage5 Jan '07 - 4:03 
CHMOD is a Unix/Linux term. I was assuming you were running this on a *IX based system. Basically, you need to give the server read/write permissions on all of the XML files. This is done using CHMOD on *IX systems, or by editing the file permissions under the properties dialog in Windows systems.

 
Quae narravi nullo modo negabo.

GeneralRe: ProblemmemberMatrixCoder5 Jan '07 - 15:57 
Well, the permissions are set correctly. I'll try messing with it some more and see if I can get it to work. I hope I can.
 




Trinity: Neo... nobody has ever done this before.
Neo: That's why it's going to work.

GeneralRe: Problemmemberrajhans8426 Jul '07 - 0:13 
CHMOD is Linux command to change the permissions of a file or directory. These permissions can be changed by the owner of that particular file or directory, or the root user of the system. If a file has attributes 777 it means everyone on that system can read write or execute that file.
 
Don't have a loan we can do it for you. Just try out our new home loan plans

GeneralRe: Problemmemberrajhans8426 Jul '07 - 0:15 
The problem seems related to the file permissions..
 
Don't have a loan we can do it for you. Just try out our new home loan plans

AnswerRe: Problemmemberbiola12 Mar '08 - 2:59 
You seem to be using moxilla firefox browser. this will not work because code is built for internet-explorer browser. To get it work, look into the code and make it moxilla compatible
GeneralNice...memberSteffen Lange13 Dec '06 - 4:57 
...PHP polling script.
BTW: There exists even more outside the ASP.NET world. Big Grin | :-D

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130516.1 | Last Updated 11 Dec 2006
Article Copyright 2006 by UsualDosage
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid