<?php 	
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	$App 	= new App();				
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/friend.class.php");
	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/classes/friends/contribution.class.php");

	// read the post from PayPal system and add 'cmd'
	$req = 'cmd=_notify-validate';
	
	foreach ($_POST as $key => $value) {
		$value = urlencode(stripslashes($value));
		$req .= "&$key=$value";
	}
	
	// post back to PayPal system to validate
	$header .= "POST /cgi-bin/webscr HTTP/1.1\r\n";
	$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
	$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";
	$fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30);
	
	if (!$fp) {
	// HTTP ERROR
	} else {
	fputs ($fp, $header . $req);
	while (!feof($fp)) {
		$res = fgets ($fp, 1024);
		if (strcmp ($res, "VERIFIED") == 0) {
		// check the payment_status is Completed
		// check that txn_id has not been previously processed
		// check that receiver_email is your Primary PayPal email
		// check that payment_amount/payment_currency are correct
		// process payment
		
		
		// echo the response
		echo "The response from IPN was: <b>" .$res ."</b><br><br>";
		
		//loop through the $_POST array and print all vars to the screen.
		
		foreach($_POST as $key => $value){
	    //    echo $key." = ". $value."<br>";
		}
		
			// check the payment_status is Completed
			// check that txn_id has not been previously processed
			// check that receiver_email is your Primary PayPal email
			// check that payment_amount/payment_currency are correct
			// process payment

			$firstname = $_POST['first_name'];
			$lastname = $_POST['last_name'];
			$itemname = $_POST['item_name'];
			$amount = $_POST['payment_gross'];
			$bugzillaEmail = $_POST['item_number'];
			
			$anonymous = $_POST['option_selection2'];
			$comment = strip_tags($_POST['option_selection1']);
			$transactionID = $_POST['txn_id'];
			$paymentStatus = $_POST['payment_status'];

			if ($anonymous == "Public")
			{
				$anonymousValue = 0;
			}
			else 
			{
				$anonymousValue = 1;
			}
			if ($amount >= 35)
			{
				$benefit = 1;			
			}
			if (strpos($amount, ".") == 0)
			{
				$amount = $amount . ".00";
			}
			
			if ($paymentStatus == "Completed")
			{
					
				// Check to see if this transaction has already been processed.
				$checkContribution = new Contribution();
				$checkTrans = $checkContribution->selectContributionExists($transactionID);
				echo "$transactionID - $checkTrans";
				if ($checkTrans == FALSE)
				{
					//Check to see if user already exists in friends
					$checkFriends = new Friend();
					$bugzillaID = $checkFriends->getBugzillaIDFromEmail($bugzillaEmail);
					$friendID = $checkFriends->selectFriendID("bugzilla_id", $bugzillaID);
					if ($friendID != 0)
					{
						// Lets Update the Friend Information
						$newFriend = new Friend();
						$newFriend->setFirstName($firstname);
						$newFriend->setLastName($lastname);
						$newFriend->setBugzillaID($bugzillaID);
						$newFriend->setIsAnonymous($anonymousValue);
						$newFriend->setIsBenefit($benefit);	
						$newFriend->setFriendID($friendID);
						$newFriendID = $newFriend->insertUpdateFriend();
						
						// FriendID does not equal 0 so we have an existing user. We need to add a new contribution

						$insertContribution = new Contribution();
						$insertContribution->setFriendID($friendID);
						$insertContribution->setAmount($amount);
						$insertContribution->setMessage($comment);
						$insertContribution->setTransactionID($transactionID);
						$insertContribution->insertContribution();
						//Record Inserted
					}
					else {
						// No friendID found so add a new friend record then add the contribution record.
						$newFriend = new Friend();
						$newFriend->setFirstName($firstname);
						$newFriend->setLastName($lastname);
						$newFriend->setBugzillaID($bugzillaID);
						$newFriend->setIsAnonymous($anonymousValue);
						$newFriend->setIsBenefit($benefit);	
						$newFriendID = $newFriend->insertUpdateFriend();
						
						$insertContribution = new Contribution();
						$insertContribution->setFriendID($newFriendID);
						$insertContribution->setAmount($amount);
						$insertContribution->setMessage($comment);
						$insertContribution->setTransactionID($transactionID);
						$insertContribution->insertContribution();
					}
				}
				else {
					echo "Transaction Check Failed<br/>";
				}
			}
	
	}
	else if (strcmp ($res, "INVALID") == 0) {
	// log for manual investigation
	
	// echo the response
	echo "The response from IPN was: <b>" .$res ."</b>";
	
	  }
	
	}
	fclose ($fp);
	}


	 
	$html = ob_get_clean();
	echo $html;
?>


