<?php

	if(false && $_SERVER['REMOTE_ADDR'] != '212.8.208.194'){
		die('Wartungsarbeiten');
	}

	$SANDBOX = false;

	session_start();
	if(
		!isset($_SESSION['WARENKORB']) ||
		!isset($_SESSION['PARAMS']) ||
		!isset($_SESSION['CLIENT'])
	){
		// session not initialized!
		die('#1');
	}

	require_once('common.php');

	if(!isset($CLIENTS[$_SESSION['CLIENT']])){
		// client has no paypal
		die('#2');
	}

	$CLIENT = $CLIENTS[$_SESSION['CLIENT']];

	// remove
	if(isset($_REQUEST['kill'])){
		$p = array_search((int) $_REQUEST['kill'], $_SESSION['WARENKORB']);
		if($p !== false){
			unset($_SESSION['WARENKORB'][$p]);
		}
	}
	
	// nw-karte
	if(!isset($_SESSION['PARAMS']['karte'])){
		$_SESSION['KARTE'] = false;
	}else if(isset($_SESSION['PARAMS']['karte']['only']) && $_SESSION['PARAMS']['karte']['only']){
		$_SESSION['KARTE'] = true;
	}else if(isset($_REQUEST['karte'])){
		$_SESSION['KARTE'] = $_REQUEST['karte'] == 'true';
	}else if(!isset($_SESSION['KARTE'])){
		die('#3');
	}
	
	// calc all
	$staffel = 0;
	$tot_amount = 0.0;
	$FOTOS = array();
	foreach($_SESSION['WARENKORB'] AS $k => $foto_id){
		// $foto_id is guranteed to be an int!
		$Q = mysql_query('SELECT can, strecke_id, size_arc_w, size_arc_h, sort FROM foto WHERE foto_id='.$foto_id);
		$FOTO = mysql_fetch_assoc($Q);
		mysql_free_result($Q);

		// check if there an entry
		if(!$FOTO){
			var_dump('no foto db entry', $foto_id, $FOTO, mysql_error());
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}

		// check if buyable
		$can = explode(',', $FOTO['can']);
		if(false === array_search('buy', $can)){
			var_dump('not buyable', $foto_id);
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}

		// get "strecke" info: buy_source
		$Q = mysql_query('SELECT strecke_id, titel, buy_source, event_id, search_event FROM strecke WHERE strecke_id='.$FOTO['strecke_id']);
		$STRECKE = mysql_fetch_assoc($Q);
		mysql_free_result($Q);
		
		// check if there an entry
		if(!$STRECKE){
			var_dump('no strecke db entry', $foto_id);
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}

		// extraxt params
		$params = json_decode($STRECKE['buy_source'], true);
		if(!isset($params[$_SESSION['CLIENT']]['paypal'])){
			var_dump('no paypal params', $foto_id);
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}
		$params = $params[$_SESSION['CLIENT']]['paypal'];
		
		if(!array_alloc_equal($_SESSION['PARAMS'], $params)){
			var_dump('different paypal params', $foto_id);
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}
		
		if($_SESSION['KARTE']){
			$params = $params['karte'];
		}
		
		// add to sum (and remember it)
		if(isset($params['preis'])){
			$p = $params['preis'];
		}else if(isset($params['staffelung'])){
			$p = $params['staffelung'][$staffel];
			if($staffel+1 < count($params['staffelung'])){
				$staffel++;
			}
		}else{
			var_dump('no paypal preis/staffelung', $foto_id);
			unset($_SESSION['WARENKORB'][$k]);
			continue;
		}

		$tot_amount += $p;

		$FOTOS[] = array(
			'event_id' => $STRECKE['event_id'],
			'event_titel' => $STRECKE['search_event'],
			'strecke_id' => $FOTO['strecke_id'],
			'strecke_titel' => $STRECKE['titel'],
			'sort' => $FOTO['sort'],
			'foto_id' => $foto_id,
			'amount' => $p,
			'size_arc_w' => $FOTO['size_arc_w'],
			'size_arc_h' => $FOTO['size_arc_h'],
			'size_arc' => round(filesize($f='../foto/'.substr($foto_id, -2).'/'.substr($foto_id, -4, 2).'/'.$foto_id.'/upload.jpeg') / 1000),
		);
		//var_dump($params);
	}

	$tot_tax = round(100*$tot_amount - 100*$tot_amount/1.19) / 100;
	$INFO = array(
		'client' => $_SESSION['CLIENT'],
		'amount' => $tot_amount,
		'tax' => $tot_tax,
	);
	if($_SESSION['KARTE']){
		if(isset($_REQUEST['karte_nummer'])){
			$_REQUEST['karte_nummer'] = trim($_REQUEST['karte_nummer']);
		}else{
			$_REQUEST['karte_nummer'] = '';
		}
		if(isset($_REQUEST['karte_name'])){
			$_REQUEST['karte_name'] = trim($_REQUEST['karte_name']);
		}else{
			$_REQUEST['karte_name'] = '';
		}
	
		$INFO['karte_name'] = $_REQUEST['karte_name'];
		$INFO['karte_nummer'] = $_REQUEST['karte_nummer'];
	}
	if($tot_amount == 0){
		$INFO['valid_until'] = time() + 60*60;
	}

	$ERRORS = array();
	if(isset($_REQUEST['next'])){
		// fotos
		if(count($FOTOS) == 0){
			$ERRORS[] = 'Es sind keine Fotos ausgewählt';
		}

		// KARTE: name & nummer
		if($_SESSION['KARTE']){
			$Q = mysql_query('SELECT id FROM paypal_nwkarte WHERE name=\''.mysql_real_escape_string($_REQUEST['karte_name']).'\' AND nummer=\''.mysql_real_escape_string(ltrim($_REQUEST['karte_nummer'], '0')).'\'');
			list($id) = mysql_fetch_row($Q);
			mysql_free_result($Q);
			if(!$id){
				$ERRORS[] = 'Der Name und die Kundennummer passen nicht zueinander.<br/>Bitte rufen Sie uns an unter: 0521 / 555 888';
			}
		}
		
		// AGB
		if(!isset($_REQUEST['agb'])){
			$ERRORS[] = 'Die AGB müssen akzeptiert werden';
		}
		
		if(count($ERRORS) > 0){
			unset($_REQUEST['next']);
		}
	}

	// id erstellen!!
	if(isset($_REQUEST['next'])){
		do{
			$id = substr(md5('pictools-paypal-bridge-id-generator:'.time().':'.mt_rand()), 0, 16);
		}while(! mysql_query('INSERT INTO paypal_download (unique_id,datetime,ip,info,foto) VALUES (\''.$id.'\', \''.gmdate('Y-m-d H:i:s').'\', \''.mysql_real_escape_string($_SERVER['REMOTE_ADDR']).'\', \''.mysql_real_escape_string(json_encode($INFO)).'\', \''.mysql_real_escape_string(json_encode($FOTOS)).'\')'));
		$Q = mysql_query('SELECT nummer FROM paypal_download WHERE unique_id=\''.$id.'\'');
		list($nummer) = mysql_fetch_row($Q);
		mysql_free_result($Q);
	}

	head($_SESSION['CLIENT']);
	
	if(isset($_REQUEST['next'])){
		echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px; padding-bottom: 10px" align="center">';
		echo '<b>Ihr Warenkorb (#'.$nummer.') enthält:</b><br/><br/>';
		echo '<a href="javascript:window.print()">Diese Seite drucken</a>';
		echo '</td></tr>';
	}
	
	foreach($FOTOS AS $I){
		echo '<tr><td width="360" rowspan="3" style="background: url(pic_left.png); padding-left: 20px; padding-bottom: 10px">';
		echo '<img src="/owl/-paypal-/'.$I['foto_id'].'s.jpeg" width="360">';
		echo '</td><td width="260" height="50" valign="top" style="padding-top: 5px; padding-left: 20px; background: url(pic_right.png);">';
		echo '<b>'.$I['strecke_titel'].'</b>';
		echo '</td></tr><tr><td width="260" valign="middle" style="padding-left: 20px; background: url(pic_right.png);">';
/*		if($I['sektion_titel'] != ''){
			echo $I['sektion_titel'].'<br/>';
		}
		echo 'Bild nr: '.($I['sort']+1).'<br>';*/
		echo 'Betrag: '.nf($I['amount']).' €<br/>';
//		echo 'Steuer enthalten: '.nf($I['tax']).' €<br/>';
		echo 'Auflösung: '.$I['size_arc_w'].' × '.$I['size_arc_h'].' Pixel<br/>';
		if($I['size_arc'] < 1000){
			echo 'Größe: '.$I['size_arc'].' kB<br>';
		}else{
			echo 'Größe: '.nf($I['size_arc']/1000, 1).' MB<br>';
		}
		$mp = $I['size_arc_w'] * $I['size_arc_h'] / 1000000;
		if($mp < 2){
			// kein hinweis, da klein!!
		}else if($mp < 3){
			echo '<br/>Das Foto eignet sich für<br/>Fotoabzüge bis 10 × 15 cm';
		}else if($mp <= 6){
			echo '<br/>Das Foto eignet sich für<br/>Fotoabzüge bis 13 × 18 cm';
		}else if($mp <= 10){
			echo '<br/>Das Foto eignet sich für<br/>Fotoabzüge bis 20 × 30 cm';
		}else if($mp <= 14){
			echo '<br/>Das Foto eignet sich für<br/>Fotoabzüge bis 30 × 45 cm';
		}else{
			echo '<br/>Das Foto eignet sich für<br/>Fotoabzüge bis 40 × 60 cm';
		}
		echo '</td></tr><tr><td width="260" height="50" valign="bottom" style="padding-left: 20px; padding-bottom: 15px; background: url(pic_right.png);">';
		if(count($FOTOS) > 0 && !isset($_REQUEST['next'])){
			echo '<a href="/paypal/?kill='.$I['foto_id'].'"><img src="/paypal/loeschen.png" border="0"></a><br/>';
		}
		echo '</td></tr>';
	}

	echo '<tr><td colspan="2" width="620" height="32" style="background: url(line.png)"></td></tr>';

	echo '<tr><td width="360" style="background: url(pic_left.png); padding-left: 20px; padding-bottom: 10px"><img src="/paypal/gesamt.png"></td>';
	echo '<td width="260" style="padding-left: 20px; padding-bottom: 15px; background: url(pic_right.png);">';
	echo 'Betrag: '.nf($tot_amount).' €<br/>';
	echo 'enthaltene MwSt. 19%: '.nf($tot_tax).' €<br/>';
	echo '</td></tr>';

	if(!isset($_REQUEST['next'])){
		echo '<form action="/paypal/" method="get">';
		echo '<input type="hidden" name="next" value="1">';

		if(count($ERRORS) > 0){
			echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px; padding-bottom: 15px; color: red">';
			echo 'FEHLER:<br/>'.implode('<br/>', $ERRORS);
			echo '</td></tr>';
		}
	
		// AGB
		echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px; padding-bottom: 15px;">';
		echo '<input type="checkbox" name="agb" value="1">';
		echo 'Ich habe die <a href="'.$CLIENT['agb'].'" target="_blank">Allgemeinen Geschäftsbedingungen</a> zur Kenntnis genommen';
		echo '</td></tr>';

	
		// KARTE!
		if($_SESSION['KARTE']){
			echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px; padding-bottom: 15px;">';
			echo '<table border="0" cellpadding="5">';
			echo '<tr><td colspan="2"></td><td rowspan="5"><img style="padding-left: 20px" src="/paypal/nwkarte_eingabe.png" width="250"></td></tr>';
			echo '<tr><th colspan="2" align="center">NW-Karte</th></tr>';
			echo '<tr><td>Vor- und Nachname</td><td><input type="text" name="karte_name" value="'.htmlspecialchars($_REQUEST['karte_name']).'"></td></tr>';
			echo '<tr><td>Kundenummer</td><td><input type="text" name="karte_nummer" value="'.htmlspecialchars($_REQUEST['karte_nummer']).'"></td></tr>';
			echo '<tr><td colspan="2"></td></tr>';
			echo '</table>';
			echo '</td></tr>';
		}
		


		// überptuefen / downloaden

		echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px;">';

		echo '<table border="0"><tr><td>';
		if($tot_amount > 0){
			echo '<input type="submit" value="Bestellung überprüfen">';
		}else{
			echo '<input type="submit" value="Download anfordern">';
		}
		echo '</td><td>';
		if($tot_amount > 0){
			echo '<a href="https://www.paypal.com/de/cgi-bin/webscr?cmd=xpt/Marketing/popup/OLCWhatIsPayPal-outside" target="_blank"><img src="/paypal/de-pp-logo-100px.png" border="0" style="padding-top: 8px; padding-left: 10px"></a>';
		}
		echo '</td></tr></table>';

		echo '</td></tr>';

		echo '</form>';
	}else if($tot_amount == 0){
		mysql_query('UPDATE paypal_download SET payment_status=\'*Free\' WHERE unique_id=\''.mysql_real_escape_string($id).'\'');

		echo '<tr><td colspan="2" align="center" style="background: url(pic_both.png); padding-left: 20px; padding-bottom: 5px; font-size: 14px">';
		echo '<a href="'.$id.'.zip"><img src="download_button.png" border="0"></a><br/>';
		echo '<a href="'.$id.'.zip">hier runterladen</a>';
		echo '</td></tr>';

		// clear warenkorb
		unset($_SESSION['WARENKORB']);
	}else{

		echo '<tr><td colspan="2" style="background: url(pic_both.png); padding-left: 20px;">';

		echo '<table border="0"><tr><td>';

		echo '<form action="https://www.'.($SANDBOX ? 'sandbox.' : '').'paypal.com/cgi-bin/webscr" method="post">';
		echo '<input type="hidden" name="cmd" value="_s-xclick">';
		echo '<input type="hidden" name="encrypted" value="'.encryptButton($x=array(
			'cmd' => '_xclick',
			'cert_id' => $CLIENT['cert_id'.($SANDBOX ? '_sandbox' : '')],
			'business' => $CLIENT['business'],
			'item_name' => count($FOTOS) == 1 ? '1 Foto zum Download' : count($FOTOS).' Fotos zum Download',
			'currency_code' => 'EUR',
			'notify_url' => $CLIENT['host'].'paypal/ipn'.($SANDBOX ? '_sandbox' : '').'.php',
			'cancel_return' => $CLIENT['host'].'paypal/',
			'return' => $CLIENT['proxy'].base64_encode($CLIENT['host'].'paypal/'.$id.'.html'),
			'no_note' => '1',
			'no_shipping' => '1',
			'on0' => 'Warenkorb',
			'os0' => '#'.$nummer,
			'cbt' => 'zum Download',
			//'cn' => '"cn" text',
			'cpp_header_image' => ('https://www.nw-news.de/_mr_daten/bilder/paypal_750x90.png'),
			//'cpp_headerback_color' => 'd71920',
			//'cpp_headerborder_color' => 'ff0000',
			//'cpp_payflow_color' => 'd71920',
			//'image_url' => ('https://www.nw-news.de/_mr_daten/bilder/paypal_150x50.png'),
			'lc' => 'de',

			'amount' => $tot_amount - $tot_tax,
			'tax' => $tot_tax,

			'invoice' => $id,
		), $CLIENT).'">';
		echo '<input type="submit" value="Mit PayPal kaufen">';
		echo '</form>';

		echo '</td><td>';
		echo '<a href="https://www.paypal.com/de/cgi-bin/webscr?cmd=xpt/Marketing/popup/OLCWhatIsPayPal-outside" target="_blank"><img src="/paypal/de-pp-logo-100px.png" border="0" style="padding-top: 8px; padding-left: 10px"></a>';
		if(TEST){
			echo '</td><td>Kann nicht abgeschlossen werden wegen testsystem!';
		}
		echo '</td></tr></table>';
	
		echo '</td></tr>';
	}
	


	$params = $_SESSION['PARAMS'];
	if($_SESSION['KARTE']){
		$params = $params['karte'];
	}

	$out = '<br/>';
	if(isset($params['preis'])){
		$out .= 'Jedes Bild kostet '.number_format($params['preis'], 2, ',', '.').' €.<br/>';
	}else if(isset($params['staffelung'])){
		$prices = $params['staffelung'];
		$any = array_pop($prices);
		foreach($prices as $k => $v){
			$out .= ($k == 0 ? 'Das' : 'das').' '.($k+1).'. Bild kostet '.number_format($v, 2, ',', '.').' €,<br/>';
		}
		$out .= 'jedes weitere Bild kostet '.number_format($any, 2, ',', '.').' €.<br/>';
	}

	if(isset($params['preis']) && $params['preis'] == 0){
		foot('', true);
	}else{
		foot($out);
	}

/*
	echo '<br/><br/><hr>';
	var_dump($_SESSION['WARENKORB'], $INFO, $FOTOS);
*/	

	function nf($num, $dec=2){
		return number_format($num, $dec, ',', '.');
	}

	function encryptButton($parameters, $CLIENT){
		global $SANDBOX;

		// gen two temp files
		$inFile = tempnam(sys_get_temp_dir(), 'paypal_crypt_in');
		$outFile = tempnam(sys_get_temp_dir(), 'paypal_crypt_out');

		// initialize data
		$data = fopen($inFile, 'w');
		foreach($parameters as $k => $v){
			fwrite($data, $k.'='.$v."\n");
		}
		fclose($data);

		// sign it
		if (!openssl_pkcs7_sign($inFile, $outFile, $CLIENT['my_certificate'], $CLIENT['my_private_key'], array(), PKCS7_BINARY)){
			return false;
		}

		// encode it
		$signedData = explode("\n\n", file_get_contents($outFile));
		file_put_contents($inFile, base64_decode($signedData[1]));

		// encrypt it
		if (!openssl_pkcs7_encrypt($inFile, $outFile, $CLIENT['paypal_certificate'.($SANDBOX ? '_sandbox' : '')], array(), PKCS7_BINARY)){
			return false;
		}

		// get the result
		$encryptedData = explode("\n\n", file_get_contents($outFile));
		
		// delete temp files
		@unlink($inFile);
		@unlink($outFile);
		
		// return
		return '-----BEGIN PKCS7-----'."\n".$encryptedData[1]."\n".'-----END PKCS7-----';
	}
	
	function array_alloc_equal($a1, $a2){
		// eleminate all those who are equal from both
		foreach($a1 AS $k => $v){
			if(!isset($a2[$k])){
				return false;
			}else{
				if(is_array($v) && is_array($a2[$k])){
					// recursive call
					if(!array_alloc_equal($v, $a2[$k])){
						return false;
					}
				}else if($v !== $a2[$k]){
					// mismatch
					return false;
				}
				// remove "seen" keys
				unset($a2[$k]);
			}
		}

		return count($a2) == 0;
	}

?>