+
+
+
diff --git a/css/style.css b/css/style.css
index 34f0d0e..91887e6 100644
--- a/css/style.css
+++ b/css/style.css
@@ -432,6 +432,27 @@ fieldset table {
background:none repeat scroll 0 0 transparent;
}
+#donations_container {
+ padding-left: 10px;
+ padding-right: 10px;
+ text-align: center;
+}
+
+#donations_bar {
+ background-color: #1B1B1B;
+ border: solid 1px #222222;
+ border-radius: 4px;
+ padding: 0px;
+}
+
+#donations_bar > div {
+ background-color: #2C2C2C;
+ border: solid 1px #4A4A4A;
+ width: 0%; /* Adjust with JavaScript */
+ height: 20px;
+ border-radius: 4px;
+}
+
.box-description {
background: #0A0A0A;
border: solid 1px #171717;
diff --git a/donate/config.php.template b/donate/config.php.template
new file mode 100644
index 0000000..89392a3
--- /dev/null
+++ b/donate/config.php.template
@@ -0,0 +1,10 @@
+
diff --git a/donate/connect.php b/donate/connect.php
new file mode 100644
index 0000000..9ff309d
--- /dev/null
+++ b/donate/connect.php
@@ -0,0 +1,11 @@
+
diff --git a/donate/connect_rw.php b/donate/connect_rw.php
new file mode 100644
index 0000000..5535887
--- /dev/null
+++ b/donate/connect_rw.php
@@ -0,0 +1,11 @@
+
diff --git a/donate/ipn.php b/donate/ipn.php
new file mode 100644
index 0000000..65ca3d2
--- /dev/null
+++ b/donate/ipn.php
@@ -0,0 +1,27 @@
+validate_ipn()) {
+ if($p->ipn_data["payment_status"] == "Completed") {
+ $amount = $p->ipn_data['mc_gross'] - $p->ipn_data['mc_fee'];
+
+ mysql_query("INSERT INTO donations (transaction_id,donor_email,amount,original_request)
+ VALUES (
+ '".esc($p->ipn_data['txn_id'])."',
+ '".esc($p->ipn_data['payer_email'])."',
+ ".(float)$amount.",
+ '".esc(http_build_query($_POST))."'
+ )");
+ }
+}
+?>
diff --git a/donate/ipn_log.txt b/donate/ipn_log.txt
new file mode 100644
index 0000000..8be6745
--- /dev/null
+++ b/donate/ipn_log.txt
@@ -0,0 +1,19 @@
+[11/11/2013 11:33 PM] - FAIL: IPN Validation Failed.
+IPN POST Vars from Paypal:
+
+IPN Response from Paypal Server:
+ HTTP/1.1 200 OK
+Server: Apache
+X-Frame-Options: SAMEORIGIN
+Content-Type: text/html; charset=UTF-8
+Date: Mon, 11 Nov 2013 23:33:04 GMT
+Content-Length: 7
+Connection: close
+Set-Cookie: cwrClyrK4LoCV1fydGbAxiNL6iG=Q8WVsKKdqyLQFBqoXGpzmTkQvzH7I4LPgcoIDqp85WIzOTAj390kKKuxW7BwLKR9p--9HP4LbyckM7OLWGX8tS7NwW0DW2pgEUkRVZlb5xqEf5zwge4extt3KoX-1uJcyrDjRgx0z8syxoJpfDaevlKT7QC_DWpmkrmsJVUF01Yj5NEoEJBNW04j-fHmvkvPZLMyaBA4p13cbJEL1OnzX_hY3tHXfOc7iDLvvdRSHC5pFBgVITKuLeYcf4hmQe1S32_75TPQco8aiH1t-ErXGerlFJdJvHabwPCnRzgaxKDBNCgXNmjnTh_te8ciXhCyIZzJZ7628D_0aMF_vwuVUW5GDdtzo1ion4tImrZqGgDNovZ3W83qpP8l8f9A5lB2NDGvQg-FttpakTHspAMXDCL9z10opFBOCnp-tY8lbLIOW-7KifdjHFJpzVy; domain=.paypal.com; path=/; HttpOnly
+Set-Cookie: cookie_check=yes; expires=Thu, 09-Nov-2023 23:33:04 GMT; domain=.paypal.com; path=/; HttpOnly
+Set-Cookie: navcmd=_notify-validate; domain=.paypal.com; path=/; HttpOnly
+Set-Cookie: navlns=0.0; expires=Wed, 11-Nov-2015 23:33:04 GMT; domain=.paypal.com; path=/; HttpOnly
+Set-Cookie: aksession=1384213084~id=cookieBi6wcHKeiJnzmVBU/ULHt1Byvz2r7r9avUleYsqNlkaY0un+AXfnbwTfA6RYjLfwwFhSMQAsFQQ82fzugGKEkcktrOJQ0PQBLgQA/lRLemQod+i2y6Vnv+5UeRwxjKyP; expires=Mon, 11-Nov-2013 23:38:04 GMT; path=/; domain=.paypal.com
+
+INVALID
+
diff --git a/donate/paypal_integration_class/paypal.class.php b/donate/paypal_integration_class/paypal.class.php
new file mode 100644
index 0000000..609d766
--- /dev/null
+++ b/donate/paypal_integration_class/paypal.class.php
@@ -0,0 +1,257 @@
+add_field('business', 'somebody@domain.com');
+ * $p->add_field('first_name', $_POST['first_name']);
+ * ... (add all your fields in the same manor)
+ * $p->submit_paypal_post();
+ *
+ * To process an IPN, have your IPN processing file contain:
+ *
+ * $p = new paypal_class;
+ * if ($p->validate_ipn()) {
+ * ... (IPN is verified. Details are in the ipn_data() array)
+ * }
+ *
+ *
+ * In case you are new to paypal, here is some information to help you:
+ *
+ * 1. Download and read the Merchant User Manual and Integration Guide from
+ * http://www.paypal.com/en_US/pdf/integration_guide.pdf. This gives
+ * you all the information you need including the fields you can pass to
+ * paypal (using add_field() with this class) aswell as all the fields
+ * that are returned in an IPN post (stored in the ipn_data() array in
+ * this class). It also diagrams the entire transaction process.
+ *
+ * 2. Create a "sandbox" account for a buyer and a seller. This is just
+ * a test account(s) that allow you to test your site from both the
+ * seller and buyer perspective. The instructions for this is available
+ * at https://developer.paypal.com/ as well as a great forum where you
+ * can ask all your paypal integration questions. Make sure you follow
+ * all the directions in setting up a sandbox test environment, including
+ * the addition of fake bank accounts and credit cards.
+ *
+ *******************************************************************************
+*/
+
+class paypal_class {
+
+ var $last_error; // holds the last error encountered
+
+ var $ipn_log; // bool: log IPN results to text file?
+ var $ipn_log_file; // filename of the IPN log
+ var $ipn_response; // holds the IPN response from paypal
+ var $ipn_data = array(); // array contains the POST values for IPN
+
+ var $fields = array(); // array holds the fields to submit to paypal
+
+
+ function paypal_class() {
+
+ // initialization constructor. Called when class is created.
+
+ $this->paypal_url = 'https://www.paypal.com/cgi-bin/webscr';
+
+ $this->last_error = '';
+
+ $this->ipn_log_file = 'ipn_log.txt';
+ $this->ipn_log = true;
+ $this->ipn_response = '';
+
+ // populate $fields array with a few default values. See the paypal
+ // documentation for a list of fields and their data types. These defaul
+ // values can be overwritten by the calling script.
+
+ $this->add_field('rm','2'); // Return method = POST
+ $this->add_field('cmd','_xclick');
+
+ }
+
+ function add_field($field, $value) {
+
+ // adds a key=>value pair to the fields array, which is what will be
+ // sent to paypal as POST variables. If the value is already in the
+ // array, it will be overwritten.
+
+ $this->fields["$field"] = $value;
+ }
+
+ function submit_paypal_post() {
+
+ // this function actually generates an entire HTML page consisting of
+ // a form with hidden elements which is submitted to paypal via the
+ // BODY element's onLoad attribute. We do this so that you can validate
+ // any POST vars from you custom form before submitting to paypal. So
+ // basically, you'll have your own form which is submitted to your script
+ // to validate the data, which in turn calls this function to create
+ // another hidden form and submit to paypal.
+
+ // The user will briefly see a message on the screen that reads:
+ // "Please wait, your order is being processed..." and then immediately
+ // is redirected to paypal.
+
+ echo "\n";
+ echo "Processing Payment...\n";
+ echo "\n";
+ echo "
Please wait, your order is being processed...
\n";
+ echo "\n";
+ echo "\n";
+
+ }
+
+ function validate_ipn() {
+
+ // parse the paypal URL
+ $url_parsed=parse_url($this->paypal_url);
+
+ // generate the post string from the _POST vars aswell as load the
+ // _POST vars into an arry so we can play with them from the calling
+ // script.
+ $post_string = '';
+ foreach ($_POST as $field=>$value) {
+ $this->ipn_data["$field"] = $value;
+ $post_string .= $field.'='.urlencode($value).'&';
+ }
+ $post_string.="cmd=_notify-validate"; // append ipn command
+
+ // open the connection to paypal
+ $fp = fsockopen($url_parsed["host"],"80",$err_num,$err_str,30);
+ if(!$fp) {
+
+ // could not open the connection. If loggin is on, the error message
+ // will be in the log.
+ $this->last_error = "fsockopen error no. $errnum: $errstr";
+ $this->log_ipn_results(false);
+ return false;
+
+ } else {
+
+ // Post the data back to paypal
+ fputs($fp, "POST $url_parsed[path] HTTP/1.1\r\n");
+ fputs($fp, "Host: $url_parsed[host]\r\n");
+ fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
+ fputs($fp, "Content-length: ".strlen($post_string)."\r\n");
+ fputs($fp, "Connection: close\r\n\r\n");
+ fputs($fp, $post_string . "\r\n\r\n");
+
+ // loop through the response from the server and append to variable
+ while(!feof($fp)) {
+ $this->ipn_response .= fgets($fp, 1024);
+ }
+
+ fclose($fp); // close connection
+
+ }
+
+ if (eregi("VERIFIED",$this->ipn_response)) {
+
+ // Valid IPN transaction.
+ $this->log_ipn_results(true);
+ return true;
+
+ } else {
+
+ // Invalid IPN transaction. Check the log for details.
+ $this->last_error = 'IPN Validation Failed.';
+ $this->log_ipn_results(false);
+ return false;
+
+ }
+
+ }
+
+ function log_ipn_results($success) {
+
+ if (!$this->ipn_log) return; // is logging turned off?
+
+ // Timestamp
+ date_default_timezone_set("UTC");
+ $text = '['.date('m/d/Y g:i A').'] - ';
+
+ // Success or failure being logged?
+ if ($success) $text .= "SUCCESS!\n";
+ else $text .= 'FAIL: '.$this->last_error."\n";
+
+ // Log the POST variables
+ $text .= "IPN POST Vars from Paypal:\n";
+ foreach ($this->ipn_data as $key=>$value) {
+ $text .= "$key=$value, ";
+ }
+
+ // Log the response from the paypal server
+ $text .= "\nIPN Response from Paypal Server:\n ".$this->ipn_response;
+
+ // Write to log
+ $fp=fopen($this->ipn_log_file,'a');
+ fwrite($fp, $text . "\n\n");
+
+ fclose($fp); // close file
+ }
+
+ function dump_fields() {
+
+ // Used for debugging, this function will output all the field/value pairs
+ // that are currently defined in the instance of the class using the
+ // add_field() function.
+
+ echo "