Quantcast
Channel: PHP Freaks: PHP Help
Viewing all articles
Browse latest Browse all 13200

Store php

$
0
0

So i have this store which links to sql values and there is a admin control panel (php)where u can edit all ur listen items, categories etc..

 

The problem here is that i can only see this in-game and i want it to be displayed in browser aswell.. i see there is a note "// Keep people out except for those in-game!" but i tried to mess with it i can't do it.

How?

 

here's the store code.

<?php
# store
	if (!defined('KODEVS') || KODEVS != 1)
		die();

	include(CLASS_DIR . 'PaymentGateway.class.php');
	include(CLASS_DIR . 'ShoppingCart.class.php');

	define('ACCOUNT_TABLE', 'TB_USER');
	define('ACCOUNT', 'strAccountID');

	define('KNIGHT_CASH', 		'nKnightCash');
	define('CPD_ID', 		'mgid'); // mgid
	define('CPD_PW', 		'mgmc'); // mgmc
	define('CPD_CH', 		'strCharID');
	define('CPD_PM', 		'param');
	define('CPD_MI', 		'nMaxItems');
	define('CPD_SI',		'nServerID');

	class Page extends BasePage
	{
		private $m_currentTab = 0;
		private $m_categories = array();
		private $m_shoppingCart;
		private $m_settings = array();

		function doRun()
		{
			$db = $this->getADB();

			$isIPN = (isset($_POST['payment_status']) && @$_GET['act'] == 'recharge' && @$_GET['subact'] == 'ipn');

			// Keep people out except for those in-game!
			if (isset($_POST[CPD_ID]) && isset($_POST[CPD_PW]) && isset($_POST[CPD_PM]))
			{
				$params = explode(',', $_POST[CPD_PM]);
				if (sizeof($params) != 4)
				{
					header('Location: /');
					return;
				}

				$db->doQuery('SELECT strAccountID, strCharID, strClientIP, nServerNo FROM CURRENTUSER WHERE strAccountID = ? AND strClientIP = ?', $_POST[CPD_ID], $this->getRemoteIP());
				if ($db->hasError() || !$db->hasRows())
				{
					header('Location: /');
					return;
				}

				$row = $db->doRead();
				if (strcmp($_POST[CPD_ID], $row['strAccountID']) !== 0)
				{
					header('Location: /');
					return;
				}

				$_SESSION[CPD_ID] = $_POST[CPD_ID];
				$_SESSION[CPD_CH] = $row['strCharID'];
				$_SESSION[CPD_PW] = $_POST[CPD_PW];
				$_SESSION[CPD_PM] = $_POST[CPD_PM];
				$_SESSION[CPD_MI] = intval($params[2]);
				$_SESSION[CPD_SI] = $row['nServerNo'];
				$_SESSION['bStoreLoggedIn'] = true;

			}
			else if (!isset($_SESSION[CPD_ID]) && !$isIPN)
			{
				header('Location: /');
				return;
			}

			if (!$isIPN)
			{
				if ($_SESSION['bStoreLoggedIn'] == true)
				{
					$db->doQuery('SELECT nKnightCash, strAuthority FROM ' . ACCOUNT_TABLE . ' WHERE ' . ACCOUNT . ' = ?', $_SESSION[CPD_ID]);
					$row = $db->doRead();
					$_SESSION[KNIGHT_CASH] = $row[KNIGHT_CASH];
					$_SESSION['strAuthority'] = $row['strAuthority'];
				}

				$this->m_shoppingCart = new ShoppingCart();

				$defaultTab = $this->doLoadCategories();
				if (!isset($_SESSION['nStoreActiveTab']))
				{
					$this->m_currentTab = $defaultTab;
					$_SESSION['nStoreActiveTab'] = $defaultTab;
				}
				else
				{
					$this->m_currentTab = $_SESSION['nStoreActiveTab'];
				}
			}

			$this->doLoadSettings();

			$this->setTitle('PAGE_STORE_TITLE');
			Template::SetVar('SERVER-URL', $this->config['SITE']['HOST']);
			Template::SetVar('PAYPAL-ADDRESS', $this->m_settings['bPaypalSandbox'] == 0 ? $this->m_settings['szPaypalEmail'] : $this->m_settings['szPaypalSandboxEmail']);
			Template::SetVar('PAYPAL-SANDBOX', $this->m_settings['bPaypalSandbox'] == 0 ? NULL : '.sandbox');
			Template::SetVar('CURRENCY', $this->m_settings['szCurrency']);
			Template::SetVar('CURRENCY-SIGN', $this->m_settings['szCurrencySymbol']);
			Template::SetVar('error', NULL);
			Template::SetPage('pus-main');

			if (!$isIPN)
			{
				if (isset($_GET['tab']))
				{
					$tabID = intval($_GET['tab']);
					if (array_key_exists($tabID, $this->m_categories))
					{
						$this->m_currentTab = $tabID;
						$_SESSION['nStoreActiveTab'] = $tabID;
					}
				}

				if ($this->m_settings['bStoreEnabled'] == 0 && !$this->isAdministrator())
				{
					if (@$_GET['act'] == 'right')
						Template::SetPage('pus-right');

					$this->doError('PUS_CLOSED');
					return;
				}

			}
			else
			{
					$this->doHandlePaymentNotification();
				return;
			}

			switch (@$_GET['act'])
			{
				case 'buy':
				{
					$this->doShoppingCartBuy();
				} break;

				case 'recharge':
				{
					if (@$_GET['subact'] == 'ipn')
					{
						$this->doHandlePaymentNotification();
					}
					else
					{
						if (@$_GET['subact'] == 'success' && @$_GET['type'] == 'daopay')
						{
							$this->doHandlePaymentNotificationDaoPay();
						}
						else
						{
							$this->doHandleRecharge();
						}
					}
				} break;

				case 'purchases':
				{
					$this->doHandlePurchaseHistory();
				} break;

				case 'right':
				{
					Template::SetPage('pus-right');

					switch ($_GET['type'])
					{
						case 'cart':
						{
							$this->doHandleShoppingCart();
						} break;

						case 'detail':
						{
							$this->doShowSideDetails();
						} break;

						default:
						{
							$this->doHandleShoppingCart();
						}
					}
				} break;

				default:
				{
					$this->doShowCategory();
				}
 			}
			Template::SetVar('STORE_CATEGORIES', $this->doShowCategories());
			Template::SetVar('KNIGHT_CASH', number_format(intval(@$_SESSION[KNIGHT_CASH])));
		}

		function doLoadSettings()
		{
			$db = $this->getADB();
			$num_rows = $db->doQuery('SELECT szKey, szValue FROM STORE_SETTINGS');
			while ($row = $db->doRead())
				$this->m_settings[$row['szKey']] = $row['szValue'];
		}

		function doLoadCategories()
		{
			$db = $this->getADB();
			$num_rows = $db->doQuery('SELECT id, nPos, szName FROM STORE_CATEGORIES ORDER BY nPos ASC');

			$lPos = -1;
			$l = -1;
			while ($row = $db->doRead())
			{
				if ($lPos == -1 || $row['nPos'] < $lPos)
				{
					$l = $row['id'];
					$lPos = $row['nPos'];
				}

				$row['szTabImage'] = 'tab_blank.gif';
				$this->m_categories[$row['id']] = $row;
			}
			return $l;
		}

		function doShowCategories()
		{
			$cats = '';
			foreach ($this->m_categories as $tabID => $row)
			{
				$selectedTab = NULL;

				if ($this->m_currentTab == $tabID)
				{
					$ext = explode('.', $row['szTabImage']);
					$ext = '.' . $ext[sizeof($ext) - 1];
					$row['szTabImage'] = str_replace($ext, 'b' . $ext, $row['szTabImage']);
					$selectedTab = 'selected-tab';
				}

				$tabWidth = strlen($row['szName']) * 9;
				if ($tabWidth < 90) $tabWidth = 90;

				$cats .= Template::Load('pus-category-1', array('category_id' => $tabID, 'category_name' => $row['szName'], 'selected_tab' => $selectedTab, 'tab-width' => $tabWidth, 'category_image' => $row['szTabImage']));
			}

			return $cats;
		}


		private function doLog($error)
		{
			$fh = fopen('./cache/errors.txt', 'a');
			fwrite($fh, $error . "\r\n");
			fclose($fh);
		}

		function doHandlePaymentNotification()
		{
			$db = $this->getADB();

			$id = intval(@$_GET['txid']) == 0 ? intval(@$_POST['custom']) : intval(@$_GET['txid']);
			if ($id == 0)
				return;
			if (!isset($_POST['custom']))
				$_POST = $_GET;

			$db->doQuery
			('
				SELECT 
					id, strAccountID, nKCAmount, nPrice, strProvider 
				FROM 
					STORE_TRANSACTIONS 
				WHERE
					id = ?
				AND
					bStatus NOT IN(3, 252, 253, 254, 255)', $id);
			if ($db->hasError() || !$db->hasRows())
				return;

			$row = $db->doRead();

			$result = false;
			switch ($row['strProvider'])
			{
				case 'PayPal':
				{
					$result = $this->doHandleNotification_PP($row);
				} break;				

				case 'DaoPay':
				{
					$result = $this->doHandleNotification_DP($row);
				} break;			
			}

			if ($result)
			{
				$user_row = $row;
				$db->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET ' . KNIGHT_CASH . ' = ' . KNIGHT_CASH . ' + ' . $user_row['nKCAmount'] . ' WHERE ' . ACCOUNT . ' = ?', $user_row['strAccountID']);
			}
		}

		function doHandleNotification_PP($row)
		{
			$db = $this->getADB();

			if (!isset($_POST['txn_id']))
				return false;

			$db->doQuery('SELECT strAccountID, txn_id, bStatus, nKCAmount FROM STORE_TRANSACTIONS WHERE txn_id = ? AND bStatus IN(252, 253, 254, 255)', $_POST['txn_id']);
			if ($db->hasError() || $db->hasRows())
				return false;

			$r = $db->doRead();

			$pIPN = new PayPal($this->m_settings['szPaypalEmail'], $this->getADB(), $this->m_settings['bPaypalSandbox']);
			$result = NULL;
			if (($result = $pIPN->doAuthenticate()) === false)
			{
				unset($pIPN);
				return false;
			}
			$pIPN->doDisconnect();

			if ($result == 'INVALID')
			{
				unset($pIPN);
				return false;
			}

			$validPrice = ($_POST['payment_gross'] == $row['nPrice']);
			$pIPN->doUpdateTable($validPrice);
			unset($pIPN);

			if ($result == 'VERIFIED' && $_POST['payment_status'] == 'Completed')
				return true;	
		//	else if ($result == 'VERIFIED' && $_POST['payment_status'] == 'Refunded')
		//		$db->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET ' . KNIGHT_CASH . ' = ' . KNIGHT_CASH . ' - ? WHERE ' . ACCOUNT . ' = ?',  $r['nKCAmount'], $r['strAccountID']);

			return false;
		}

		function doHandleNotication_DP($row)
		{
			$db = $this->getADB();
			//if (!isset($_GET['some ID']))
			//	return false;

		
		}

		function doHandlePurchaseHistory()
		{
			$db = $this->getADB();
			$db->doQuery('SELECT TOP 64 id, purchaseTime, strClientIP, strAccountID, strCharID, strItems, strQuantities, nCost FROM STORE_PURCHASES WHERE strAccountID = ? ORDER BY id DESC', $_SESSION[CPD_ID]);
			$purchases = '';

			$i = 0;
			$purchaseRows = array();
			while ($row = $db->doRead())
				$purchaseRows[] = $row;

			$content = '';				
			foreach ($purchaseRows as $row)
			{
				$strPackages = explode(',', $row['strItems']);
				$strQuantities = explode(',', $row['strQuantities']);
				$content = '';
				$price = 0;
				$n = 0;

				foreach ($strPackages as $id)
				{
					$info = $this->getPackageInfo($id);
					if ($info == -1) continue;
					$quantity = $strQuantities[$n++];
					if (sizeof($info[1]) > 1) // multiple items
					{
						$items_tmp = '';
						foreach ($info[1] as $item)
						{
							$item = $this->getItemInfo($item);
							if ($item == -1) continue;

							$items_tmp .= Template::Load('pus-purchases-item-package-item', array
							(
								'ITEM-NAME'	=> $item['nQuantity'] . ' x ' . @$item['strName'] . (@$item['Countable'] == 1 ? '(' . $item['Duration'] . ')' : NULL),
								'ITEM-ICON'	=> $this->GetIconID($item['Num']),
								'ITEM-PRICE'	=> number_format($info[0]['nCost']),
							));
						}
						$price += $info[0]['nCost'];

						$content .= Template::Load('pus-purchases-item-package', array
						(
							'PACKAGE-QUANTITY'	=> $quantity,
							'PACKAGE-NAME'		=> @$info[0]['strName'],
							'PACKAGE-ID'		=> ($i + 1),
							'PACKAGE-ITEMS'		=> $items_tmp,
							'PACKAGE-PRICE'		=> number_format($info[0]['nCost'])
						));
					}
					else
					{
						$item = $this->getItemInfo($info[1][0]);
						$price += $info[0]['nCost'];
						$content .= Template::Load('pus-purchases-item-item', array
						(
							'ITEM-ICON'		=>	$this->GetIconID($item['Num']),
							'ITEM-QUANTITY'		=>	$quantity,
							'ITEM-NAME'		=>	@$info[0]['strName'],
							'ITEM-ID'		=>	($i + 1),
							'ITEM-PRICE'		=>	number_format($info[0]['nCost']),
						));
					}
					
				}

				$row['i'] = ($i += 4);
				$purchases .= Template::Load('pus-purchases-row', array_merge($row, array('content' => $content, 'price' => number_format($price))));	
			}

			$this->loadTPL('pus-purchases-main', array('purchases' => $purchases, 'total' => sizeof($purchaseRows)));
		}

		function doHandleRecharge()
		{
			$db = $this->getADB();

			switch (@$_GET['subact'])
			{
				case 'process':
				{
					$id = intval(@$_POST['item']);
					if ($id > 0)
					{
						$db->doQuery('SELECT id, strName, nKCAmount, nPrice FROM STORE_KC_OPTIONS WHERE id = ?', $id);
						if ($db->hasError())
						{
							$this->doError('DB_ERROR');
							return;
						}
						else if (!$db->hasRows())
						{
							$this->doError('PUS_NO_KC_OPTIONS'); // Not quite but we'll live with hackers getting a bad message
							return;
						}
						$optionData = $db->doRead();
						if (@$_POST['paypal'] == 1) // gotta re-do this
						{
							$provider = 'PayPal';
						}	
						else
						{
							$this->doError('PUS_NO_KC_OPTIONS');
							return;
						}
				
						$db->doQuery('INSERT INTO STORE_TRANSACTIONS (strAccountID, strClientIP, strCharID, nKCPackage, nKCAmount, nPrice, strProvider, bStatus) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', $_SESSION[CPD_ID], $this->getRemoteIP(), $_SESSION[CPD_CH], $id, $optionData['nKCAmount'], $optionData['nPrice'], $provider, TS_PREPURCHASE);
						if ($db->hasError())
						{
							$this->doError('DB_ERROR');
							return;
						}

						$num_rows = $db->doQuery('SELECT TOP 1 id FROM STORE_TRANSACTIONS WHERE strAccountID = ? ORDER BY id DESC', $_SESSION[CPD_ID]);
						$row = $db->doRead();
						if ($this->m_settings['bUseForumUsername'] == TRUE)
						{
							$this->loadTPL('pus-recharge-forum', array('id' => $row['id'], 'id2' => $id, 'provider' => $provider));
							return;
						}

						$optionData['transaction-id'] = $row['id'];
						$optionData['strName'] .= ' (non-refundable virtual item)';
						switch ($provider)
						{
							case 'PayPal':
								$this->loadTPL('pus-recharge-ppredirect', $optionData);
								break;
						}
						return;
					}
				} break;

				case 'forum':
				{
					$id = @$_POST['id'];
					$id2 = @$_POST['id2'];
					$provider = @$_POST['provider'];
					$forum_name = @$_POST['account'];

					if ($forum_name == NULL || $id == NULL || $id2 == NULL || $provider == NULL || $provider != 'PayPal') // limit it to paypal for now anyway -_-
					{
						$this->doError('DB_ERROR');
						return;
					}

					$db->doQuery('SELECT id, strName, nKCAmount, nPrice FROM STORE_KC_OPTIONS WHERE id = ?', $id2);
					if ($db->hasError())
					{
						$this->doError('DB_ERROR');
						return;
					}
					else if (!$db->hasRows())
					{
						$this->doError('PUS_NO_KC_OPTIONS'); // Not quite but we'll live with hackers getting a bad message
						return;
					}
					$optionData = $db->doRead();

					$db->doQuery('SELECT TOP 1 id FROM STORE_TRANSACTIONS WHERE strAccountID = ? AND id = ?', $_SESSION[CPD_ID], $id);
					if ($db->hasError() || !$db->hasRows())
					{
						$this->doError('DB_ERROR');
						return;
					}
					$row = $db->doRead();
					$optionData['transaction-id'] = $row['id'];
					$optionData['strName'] .= ' (non-refundable virtual item)';
					$db->doQuery('UPDATE STORE_TRANSACTIONS SET forum_username = ? WHERE strAccountID = ? AND id = ?', $forum_name, $_SESSION[CPD_ID], $id);

					switch ($provider)
					{
						case 'PayPal':
							$this->loadTPL('pus-recharge-ppredirect', $optionData);
							break;
					}
					return;
				} break;

				case 'success':
				{
					$id = intval(@$_GET['id']);
					if ($id > 0)
					{
						if (isset($_SESSION[CPD_ID]) && isset($_POST['payment_status'])) // Cut to the chase before IPN!
							$this->doHandlePaymentNotification();

						$db->doQuery('SELECT id, bStatus FROM STORE_TRANSACTIONS WHERE id = ? AND strAccountID = ?', $id, $_SESSION[CPD_ID]);
						if ($db->hasError())
						{
							$this->doError('DB_ERROR');
							return;
						}
						else if ($db->hasRows())
						{
							$row = $db->doRead();
							if ($row['bStatus'] == 3)
								$this->doError('PUS_PAYMENT_COMPLETED', NULL);
							else
								$this->doError('PUS_PAYMENT_BEING_PROCESSED', NULL);
							return;

						}
					}
				} break;

				case 'cancel':
				{
					$id = intval(@$_GET['id']);
					if ($id > 0)
					{
						$db->doQuery('SELECT id FROM STORE_TRANSACTIONS WHERE id = ? AND strAccountID = ? AND bStatus <> 3', $id, $_SESSION[CPD_ID]);
						if ($db->hasError())
						{
							$this->doError('DB_ERROR');
							return;
						}
						else if ($db->hasRows())
						{
							$db->doQuery('DELETE FROM STORE_TRANSACTIONS WHERE id = ?', $id);
						}
					}
				} break;
			}

			$transactions = $this->doLoadRecentTransactions();

			$db->doQuery('SELECT id, strName, nKCAmount, nPrice FROM STORE_KC_OPTIONS ORDER BY nKCAmount DESC');
			if ($db->hasError())
			{
				$this->doError('DB_ERROR');
				return;
			}
			else if (!$db->hasRows())
			{
				$this->doError('PUS_NO_KC_OPTIONS');
				return;
			}
			$content = '';
			while ($row = $db->doRead())
			{
				$row['nPrice'] = number_format($row['nPrice'], 2);
				$content .= Template::Load('pus-recharge-option', $row);
			}
			$this->loadTPL('pus-recharge-main', array('transactions' => $transactions, 'options' => $content));
		}

		function doLoadRecentTransactions()
		{
			$db = $this->getADB();
			$db->doQuery('SELECT TOP 18 dDate, strName, STORE_KC_OPTIONS.nPrice, strProvider, bStatus, payment_processed, payment_status, txn_id, payer_email, pending_reason, payment_type FROM STORE_TRANSACTIONS INNER JOIN STORE_KC_OPTIONS ON nKCPackage = STORE_KC_OPTIONS.id WHERE strAccountID = ? AND payment_status IS NOT NULL ORDER BY STORE_TRANSACTIONS.id DESC', $_SESSION[CPD_ID]);
			if ($db->hasError() || !$db->hasRows())
				return NULL;

			$transactions = '';
			while ($row = $db->doRead())
			{
				$date = explode(' ', $row['dDate']);
				$row['dDate'] = $date[0];

				$date = explode(' ', $row['payment_processed']);
				if (sizeof($date) > 1) $row['payment_processed'] = $date[0];
				if ($row['payment_status'] != 'Completed') $row['payment_processed'] = 'N/A';
				$transactions .= Template::Load('pus-transactions-row', $row);
			}

			return Template::Load('pus-transactions-table', array('transactions' => $transactions));
		}

		function doShowCategory()
		{
			$db = $this->getADB();
			$gdb = $this->getGDB();
			$num_rows = $db->doQuery('SELECT STORE_LISTED_ITEMS.id, nListedItemID, szPackageName, nStoreItemID, nCost, nSpecialType, nQuantity, nValue, nMaxQty, (SELECT COUNT(*) FROM STORE_ITEM_DATA WHERE nListedItemID = STORE_LISTED_ITEMS.id) as nPackageItems FROM STORE_LISTED_ITEMS INNER JOIN STORE_ITEM_DATA ON nStoreItemID = STORE_ITEM_DATA.id WHERE nCategory = ? ORDER BY nCost DESC', $this->m_currentTab);
			if ($db->hasError())
			{
				$this->doError('DB_ERROR');
				return;
			}
			else if (!$db->hasRows())
			{
				$this->doError('PUS_NO_ITEMS');
				return;
			}

			$data = array();
			$itemCount = $num_rows;
			$pageCount = ceil($num_rows / 9);

			$page = intval(@$_GET['p']) == 0 ? 1 : (intval($_GET['p']) > $pageCount ? 1 : intval($_GET['p']));
			$pageStart = ((9 * $page) - 9);
			if ($pageStart > $itemCount)
				$pageStart = 0;

			$rows = array();
			while ($row = $db->doRead()) 
				$rows[] = $row;	

			$itemCount = sizeof($rows) - $pageStart;

			$pages = '';
			for ($i = 1; $i <= $pageCount; $i++)
			{
				if ($i == $page) $pages .= Template::Load('pus-pageno-link-none', array('id' => $i));
				else $pages .= Template::Load('pus-pageno-link', array('id' => $i));
			}
	
			Template::SetVar('page-no', $pages); // $page . ' / ' . $pageCount

			$n = 0;
			for ($i = $pageStart; $i < ($pageStart + 10); $i++)
			{
				$id = 'store-item-' . $n;
				if (($n+1) > $itemCount)
				{
					$data[$id] = NULL;
					$n++;
					continue;
				}

				$row = $rows[$i];
				if ($row['nSpecialType'] == 0)
				{
					$gdb->doQuery('SELECT Num, strName, Countable, Duration FROM ITEM WHERE Num = ?', $row['nValue']);
					if ($gdb->hasError())
					{
						$this->doError('DB_ERROR');
						return;
					}
					else if (!$gdb->hasRows())
					{
						$itemCount--;
						continue;

						$row['Num'] = $row['nValue'];
						$row['strName'] = $row['szPackageName'];
						$row['Num'] = $row['nValue'];
					}
					else
					{
						$row2 = $gdb->doRead();
						$row['Num'] = $row2['Num'];
						$row['strName'] = $row['szPackageName'] != ' '  ? $row['szPackageName'] : @$row2['strName'];
						$row['Num'] = $row2['Num'];
						if ($row2['Countable'] == 1)
						{
							$row['nQuantity'] = $row2['Duration'];
						}
					}
				}
				else if ($row['nSpecialType'] == 3) // Premium
				{
					$row['Num'] = $row['nListedItemID'];
					$row['strName'] = $row['szPackageName'];
					$row['Num'] = $row['nValue'];
				}
				else
				{
					$itemCount--;
					continue;
				}

				$data[$id] = Template::Load('pus-item', 
					array
					(
						'ITEM-ID'	=> $row['id'],
						'ITEM-NAME'	=> @$row['strName'],
						'ITEM-TYPE'	=> $this->getSpecialType($row['nSpecialType']),
						'ITEM-PRICE'	=> number_format(intval($row['nCost'])),
						'ITEM-QTY'	=> ($row['nPackageItems'] > 1 ? 1 : number_format($row['nQuantity'])),
						'ITEM-MAXQTY'	=> $row['nMaxQty'],
						'ITEM-ICON'	=> $this->GetIconID($row['Num'])
					)
				);
				$n++;
			}

			if ($itemCount == 0)
			{
				$this->doError('PUS_NO_ITEMS');
				return;
			}


			$this->loadTPL('pus-item-category', $data);
		}

		function doShowSideDetails()
		{
			$adb = $this->getADB();
			$gdb = $this->getGDB();
			$id = intval($_GET['id']);
			if ($id == 0)
			{
				$this->doError('PUS_ITEM_NOT_FOUND');
				return;
			}

			$adb->doQuery('SELECT STORE_LISTED_ITEMS.id, nListedItemID, szPackageName, szPackageDescription, szItemDuration, nStoreItemID, nCost, nSpecialType, nMaxQty, nQuantity, nValue FROM STORE_LISTED_ITEMS INNER JOIN STORE_ITEM_DATA ON nStoreItemID = STORE_ITEM_DATA.id WHERE STORE_LISTED_ITEMS.id = ?', $id);
			if ($adb->hasError())
			{
				$this->doError('DB_ERROR');
				return;
			}
			else if (!$adb->hasRows())
			{
				$this->doShowSidePopular();
				return;
			}
			$row = $adb->doRead();
			$package = $row;

			$adb->doQuery('SELECT id, nListedItemID, nSpecialType, nQuantity, nValue, nPremiumDays FROM STORE_ITEM_DATA WHERE nListedItemID = ?', $id);
			if ($adb->hasError())
			{
				$this->doError('DB_ERROR');
				return;
			}
			else if (!$adb->hasRows())
			{
				$this->doError('PUS_INVALID_PACKAGE');
				return;
			}

			$items = array();
			while ($row = $adb->doRead())
				$items[] = $row;

			if ($package['nSpecialType'] == 0)
			{
				$gdb->doQuery('SELECT Num, strName, Duration, Countable FROM ITEM WHERE Num = ?', $package['nValue']);
				if ($gdb->hasError())
				{
					$this->doError('DB_ERROR');
					return;
				}
				else if (!$gdb->hasRows())
				{
					$this->doError('PUS_ITEM_NOT_FOUND');
					return;
				}
				$row = $gdb->doRead();
				$package = array_merge($package, $row);
				$package['strName'] = ($package['szPackageName'] != ' ' ? $package['szPackageName'] : @$package['strName']);
			}
			else
			{
				$package['Num'] = $package['nValue'];
				$package['strName'] = $package['szPackageName'];
				$package['Num'] = $package['nValue'];
			}

			$this->loadTPL('pus-right-item', 
			array
			(
				'item-id'	=> @$package['Num'],
				'item-name'	=> @$package['strName'],
				'item-price'	=> number_format(intval($package['nCost'])),
				'item-qty'	=> @$package['Countable'] == 1 ? number_format($package['Duration']) : $package['nQuantity'],
				'item-duration' => $package['szItemDuration'] == ' ' ? 'N/A' : $package['szItemDuration'],
				'item-description' => $package['szPackageDescription'] == ' ' ? 'N/A' : $package['szPackageDescription'],
				'item-icon'	=> $this->GetIconID($package['Num'])

			));
		}

		function doShowSidePopular()
		{
			$this->loadTPL('pus-right-popular');
		}

		function doHandleShoppingCart()
		{
			switch (@$_GET['subact'])
			{
				case 'add':
				{
					$this->doShoppingCartAdd();
				} break;				

				case 'del':
				{
					$this->doShoppingCartDel();
				} break;

				default:
				{
					$this->doShoppingCartView();
				}
			}
		}

		function doShoppingCartView()
		{
			$content = '';
			for ($i = 0; $i < $this->m_shoppingCart->getCount(); $i++)
			{
				$info = $this->getPackageInfo($this->m_shoppingCart->getItemID($i));
				if ($info == -1) continue;

				if (sizeof($info[1]) > 1) // multiple items
				{
					$items_tmp = '';
					foreach ($info[1] as $item)
					{
						$item = $this->getItemInfo($item);
						if ($item == -1) continue;

						$items_tmp .= Template::Load('pus-cart-item-package-item', array
						(
							'ITEM-NAME'	=> $item['nQuantity'] . ' x ' . @$item['strName'] . (@$item['Countable'] == 1 ? '(' . $item['Duration'] . ')' : NULL),
							'ITEM-ICON'	=> $this->GetIconID($item['Num']),
							'ITEM-PRICE'	=> number_format($this->m_shoppingCart->getItemPrice($i)),
						));
					}

					$content .= Template::Load('pus-cart-item-package', array
					(
						'PACKAGE-QUANTITY'	=> $this->m_shoppingCart->getItemQuantity($i),
						'PACKAGE-NAME'		=> @$info[0]['strName'],
						'PACKAGE-ID'		=> ($i + 1),
						'PACKAGE-ITEMS'		=> $items_tmp,
						'PACKAGE-PRICE'		=> number_format($this->m_shoppingCart->getItemPrice($i))
					));
				}
				else
				{
					$item = $this->getItemInfo($info[1][0]);
					$content .= Template::Load('pus-cart-item-item', array
					(
						'ITEM-ICON'		=>	$this->GetIconID($item['Num']),
						'ITEM-QUANTITY'		=>	$this->m_shoppingCart->getItemQuantity($i),
						'ITEM-NAME'		=>	@$info[0]['strName'],
						'ITEM-ID'		=>	($i + 1),
						'ITEM-PRICE'		=>	number_format($this->m_shoppingCart->getItemPrice($i)),
					));
				}
			}

			if ($this->m_shoppingCart->getCount() > 0)
				$content .= Template::Load('pus-cart-footer', array
				(
					'CART-TOTAL'	=> number_format($this->m_shoppingCart->getTotalCost()),
					'KNIGHT-CASH'	=> number_format(intval(@$_SESSION[KNIGHT_CASH])),
					'CART-AFTERKC'	=> number_format($_SESSION[KNIGHT_CASH] - $this->m_shoppingCart->getTotalCost()),
				));
			else
				$content .= Template::Load('pus-cart-footer-none');				

			$this->loadTPL('pus-cart-main', array
			(
				'ITEM-COUNT'	=> $this->m_shoppingCart->getTotalItems(),
				'SLOTS-FREE'	=> $_SESSION[CPD_MI],
				'CART-CONTENT'	=> $content

			));
		}

		function getPackageInfo($id)
		{
			$adb = $this->getADB();
			$gdb = $this->getGDB();

			$adb->doQuery('SELECT STORE_LISTED_ITEMS.id, nListedItemID, szPackageName, nStoreItemID, nCost, nSpecialType, nQuantity, nValue, (SELECT SUM(nQuantity) FROM STORE_ITEM_DATA WHERE nListedItemID = STORE_LISTED_ITEMS.id AND nSpecialType = 0) as nTotalItems FROM STORE_LISTED_ITEMS INNER JOIN STORE_ITEM_DATA ON nStoreItemID = STORE_ITEM_DATA.id WHERE STORE_LISTED_ITEMS.id = ?', $id);
			if ($adb->hasError() || !$adb->hasRows())
			{
				$this->doError('DB_ERROR');
				return -1;
			}
			$row = $adb->doRead();
			$package = $row;

			$adb->doQuery('SELECT id, nListedItemID, nSpecialType, nQuantity, nValue, nPremiumDays FROM STORE_ITEM_DATA WHERE nListedItemID = ?', $id);
			if ($adb->hasError())
			{
				$this->doError('DB_ERROR');
				return;
			}
			else if (!$adb->hasRows())
			{
				$this->doError('PUS_INVALID_PACKAGE');
				return;
			}

			$items = array();
			while ($row = $adb->doRead())
				$items[] = $row;

			if ($package['nSpecialType'] == 0)
			{
				$gdb->doQuery('SELECT Num, strName, Duration, Countable FROM ITEM WHERE Num = ?', $package['nValue']);
				if ($gdb->hasError())
				{
					$this->doError('DB_ERROR');
					return;
				}
				else if (!$gdb->hasRows())
				{
					$this->doError('PUS_INVALID_PACKAGE');
					return;
				}
				$row = $gdb->doRead();
				$package = array_merge($package, $row);
				$package['strName'] = ($package['szPackageName'] != ' ' ? $package['szPackageName'] : @$package['strName']);
			}
			else
			{
				$package['Num'] = $package['nValue'];
				$package['strName'] = $package['szPackageName'];
				$package['Num'] = $package['nValue'];
			}

			return array($package, $items);
		}

		function getItemInfo($row)
		{
			$db = $this->getGDB();
			$nSpecialType = $row['nSpecialType'];			

			if ($nSpecialType == 0)
			{
				$db->doQuery('SELECT Num, strName, Duration, Countable FROM ITEM WHERE Num = ?', $row['nValue']);
				if ($db->hasError())
				{
					$this->doError('DB_ERROR');
					return -1;
				}
				else if ($db->hasRows())
				{
					$newRow = $db->doRead();
					return array_merge($newRow, $row);
				}
			}
			else if ($nSpecialType == 3)
			{

				return array('strName' => $row['nPremiumDays'] . Template::GetLangVar('PUS_DAYS_OF_PREMIUM_SERVICE'), 'Num' => $row['nValue'], 'Num' => $row['nValue']);
			} 

			return -1;
		}

		function GetIconID($id)
		{
			if ($id == '0')
				$id = str_pad($id, 8, '0');

			$result = @substr($id, 0, 1) . '_' . @substr($id, 1, 4) . '_' . @substr($id, 5, 2) . '_' . @substr($id, 7, 1);
			$test = './themes/default/images/itemicons/itemicon_' . $result . '.jpg';
			if (file_exists($test))
				return $result;

			return $this->GetIconID('0');
		}
	

		function doShoppingCartAdd()
		{
			$adb = $this->getADB();
			$gdb = $this->getGDB();

			$id = intval(@$_GET['id']);
			$qty = intval(@$_GET['qty']) == 0 ? 1 : $_GET['qty'];

			if ($id == 0)
			{
				Template::SetVar('error', Template::GetLangVar('PUS_ITEM_NOT_FOUND'));
			}
			else
			{
				$adb->doQuery('SELECT STORE_LISTED_ITEMS.id, nListedItemID, szPackageName, nStoreItemID, nCost, nValue, nQuantity, nMaxQty, nPremiumDays, (SELECT COUNT(*) FROM STORE_ITEM_DATA WHERE nListedItemID = STORE_LISTED_ITEMS.id) as nPackageItems, (SELECT SUM(nQuantity) FROM STORE_ITEM_DATA WHERE nListedItemID = STORE_LISTED_ITEMS.id AND nSpecialType = 0) as nTotalQuantity, nSpecialType FROM STORE_LISTED_ITEMS INNER JOIN STORE_ITEM_DATA ON nStoreItemID = STORE_ITEM_DATA.id WHERE STORE_LISTED_ITEMS.id = ?', $id);
				if ($adb->hasError())
				{
					$this->doError('DB_ERROR');
					return;
				}
				else if (!$adb->hasRows())
				{
					Template::SetVar('error', Template::GetLangVar('PUS_ITEM_NOT_FOUND'));
					return;
				}

				$row = $adb->doRead();

				$nQuantity = $row['nQuantity']; 
				$bStackable = false;
				$nStack = 1;
				if ($row['nSpecialType'] == 0)
				{
					$gdb->doQuery('SELECT Countable, Duration FROM ITEM WHERE Num = ?', $row['nValue']);
					if ($gdb->hasError())
					{
						$this->doError('DB_ERROR');
						return;
					}
					$row2 = $gdb->doRead();
					if ($row2['Countable'] == 1)
					{
						$bStackable = true;
						$nStack = $row2['Duration'];
					}
				}

				$total_items = $this->m_shoppingCart->getTotalItems();
				$nPackageItems = $row['nPackageItems'];
				$nAvailableSlots = $_SESSION[CPD_MI];
				$overboard = false;

				if (($total_items + ($nPackageItems * $qty)) > $nAvailableSlots)
					$overboard = true;

				if ($nPackageItems == 1 && $row['nSpecialType'] == 3) // exception to the rule
					$overboard = false;
			
				if ($overboard == true)
				{
					Template::SetVar('error', Template::GetLangVar('PUS_ADD_MORE_THAN_AVAILABLE'));
				}
				else
				{
					$nMaxQty = $row['nMaxQty'];
					$item = $this->m_shoppingCart->findItem($id);
					$curQty = ($item != -1 ? $this->m_shoppingCart->getItemQuantity($item) : 0);
					if (($qty + $curQty) > $nMaxQty)
						Template::SetVar('error', Template::GetLangVar('PUS_ADD_TOO_MANY', array('arg0' => $nMaxQty)));
					else if (($this->m_shoppingCart->getTotalCost() + ($row['nCost'] * $qty)) > $_SESSION[KNIGHT_CASH] && $qty > 1)
					{
						$oldQty = $qty;
						$qty = floor(($_SESSION[KNIGHT_CASH] - $this->m_shoppingCart->getTotalCost()) / $row['nCost']);
						if ($qty > 0)
						{
							Template::SetVar('error', Template::GetLangVar('PUS_ADD_TOO_MANY_SUBSTITUTE', array('arg0' => $oldQty, 'arg1' => $qty)));
							$this->m_shoppingCart->addItem($row['nListedItemID'], $row['nCost'], $this->getSpecialType($row['nSpecialType']), $row['nPackageItems'], $qty, $row['nTotalQuantity'], $bStackable, $nStack);
						}
						else
						{
							Template::SetVar('error', Template::GetLangVar('PUS_NEED_KC'));
						}
					}
					else if ($qty == 0 || ($this->m_shoppingCart->getTotalCost() + ($row['nCost'] * $qty)) > $_SESSION[KNIGHT_CASH])
					{
						if ($this->m_shoppingCart->getTotalCost() > 0)
							Template::SetVar('error', Template::GetLangVar('PUS_NEED_KC_CART'));
						else
							Template::SetVar('error', Template::GetLangVar('PUS_NEED_KC'));
					}
					else
					{
						$this->m_shoppingCart->addItem($row['nListedItemID'], $row['nCost'], $this->getSpecialType($row['nSpecialType']), $row['nPackageItems'], $qty, $row['nTotalQuantity'], $bStackable, $nStack);
					}
				}
			}
			$this->doShoppingCartView();
		}

		function doShoppingCartDel()
		{
			$id = intval(@$_GET['id']) - 1;
			$qty = intval(@$_GET['qty']) == 0 ? 1 : @$_GET['qty'];
			$item = $this->m_shoppingCart->getItemID($id);
			if ($id < 0 || $item == -1)
			{
				$this->doError('PUS_ITEM_NOT_FOUND');
				return;
			}
			$this->m_shoppingCart->delItem($id, $qty);
			$this->doShoppingCartView();
		}

		function doShoppingCartBuy()
		{
			$adb = $this->getADB();
			$gdb = $this->getGDB();

			if ($this->m_shoppingCart->getCount() == 0)	
			{
				$this->doError('PUS_BUY_NO_ITEMS');
				return;
			}
			else if ($_SESSION[KNIGHT_CASH] < $this->m_shoppingCart->getTotalCost())
			{
				$this->doError('PUS_BUY_NEED_KC');
				return;
			}

			$cart = $this->m_shoppingCart;
			$packages = '';
			$quantities = '';
			for ($i = 0; $i < $this->m_shoppingCart->getCount(); $i++)
			{
				$pInfo = $this->getPackageInfo($cart->getItemID($i));
				if ($pInfo == -1) continue;
				$packages .= $pInfo[0]['id'] . ',';
				$quantity = $this->m_shoppingCart->getItemQuantity($i);
				$quantities .= $quantity . ',';
				for ($n = 0; $n < $quantity; $n++)
				{
					foreach ($pInfo[1] as $info)
					{
						if ($this->getSpecialTypeToChar($info['nSpecialType']) == 'P')
						{
							if ($this->m_settings['nPremiumType'] == 0)
							{
								$adb->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET PremiumExpire = (PremiumExpire + ' . intval($info['nPremiumDays']) . ') WHERE ' . ACCOUNT . ' = ? AND PremiumExpire IS NOT NULL AND DateDiff(dd, GetDate(), PremiumExpire) > 0 ', $_SESSION[CPD_ID]);
								$adb->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET PremiumExpire = (GetDate() + ' . intval($info['nPremiumDays']) . ') WHERE ' . ACCOUNT . ' = ? AND (PremiumExpire IS NULL OR DateDiff(dd, GetDate(), PremiumExpire) <= 0)', $_SESSION[CPD_ID]);
							}
							else if ($this->m_settings['nPremiumType'] == 1)
							{
								$adb->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET PremiumType = 1, PremiumDays = ? WHERE ' . ACCOUNT . ' = ?', $cart->GetItemPDays($i), $_SESSION[CPD_ID]);
							}
							else if ($this->m_settings['nPremiumType'] == 2)
							{
								$adb->doQuery('SELECT strAccountID FROM PREMIUM_SERVICE WHERE strAccountID = ?', $_SESSION[CPD_ID]);
								if ($adb->hasError())
								{
									continue;
								}
								else if (!$adb->hasRows())
								{
									$adb->doQuery('INSERT INTO PREMIUM_SERVICE (strAccountID, strType, nDays) VALUES (?, ?, ?)', $_SESSION[CPD_ID], 1, $cart->GetItemPDays($i));
								}
								else
								{
									$adb->doQuery('UPDATE PREMIUM_SERVICE SET strType = 1, nDays = nDays + ? WHERE strAccountID = ?', $cart->GetItemPDays($i), $_SESSION[CPD_ID]);
								}
							}
						}
						else
						{
							for ($x = 0; $x < $info['nQuantity']; $x++)
							{
								$gdb->doQuery('INSERT INTO WEB_ITEMMALL 
										(strAccountID, strCharID, ServerNo, ItemID, ItemCount, BuyTime, img_file_name, strItemName, price, pay_type)
										VALUES(?, ?, ?, ?, ?, GetDate(), ?, ?, ?, ?)', $_SESSION[CPD_ID], $_SESSION[CPD_CH], intval($_SESSION[CPD_SI]), $info['nValue'], $cart->getItemQuantity($i), 'na', 'na', $cart->getItemPrice($i), 0);
								if ($gdb->hasError())
								{
									$this->doError('DB_ERROR');
									return;
								}
								$gdb->doQuery('INSERT INTO WEB_ITEMMALL_LOG 
										(strAccountID, strCharID, ServerNo, ItemID, ItemCount, BuyTime, img_file_name, strItemName, price, pay_type)
										VALUES(?, ?, ?, ?, ?, GetDate(), ?, ?, ?, ?)', $_SESSION[CPD_ID], $_SESSION[CPD_CH], intval($_SESSION[CPD_SI]), $info['nValue'], $cart->getItemQuantity($i), 'na', 'na', $cart->getItemPrice($i), 0);
							}
						}
					}
				}
			}

			$packages = substr($packages, 0, strlen($packages) - 1);
			$quantities = substr($quantities, 0, strlen($quantities) - 1);
			$adb->doQuery('INSERT INTO STORE_PURCHASES (purchaseTime, strClientIP, strAccountID, strCharID, strItems, strQuantities, nCost) VALUES (GetDate(), ?, ?, ?, ?, ?, ?)', $this->getRemoteIP(), $_SESSION[CPD_ID], $_SESSION[CPD_CH], $packages, $quantities, $cart->getTotalCost());
			
			$_SESSION[CPD_MI] -= $cart->getTotalItems();
			if ($_SESSION[CPD_MI] < 0)
				$_SESSION[CPD_MI] = 0;

			$_SESSION[KNIGHT_CASH] -= $cart->getTotalCost();
			$adb->doQuery('UPDATE ' . ACCOUNT_TABLE . ' SET ' . KNIGHT_CASH . ' = ' . KNIGHT_CASH . ' - ? WHERE ' . ACCOUNT . ' = ?', $cart->getTotalCost(), $_SESSION[CPD_ID]);
			$cart->emptyCart();
			$this->doError('PUS_BUY_SUCCESS', NULL);
		}

		function getSpecialType($nSpecialType)
		{
			return $this->getSpecialTypeToChar($nSpecialType);
		}

		function doError($error, $title = 'ERROR')
		{
			$this->loadTPL('pus-right-error', array('errmsg' => Template::GetLangVar($error), 'errtitle' => $title));
		}

		function getSpecialTypeToChar($type)
		{
			switch ($type)
			{
				case 3: // Premium
					return 'P';
				break;
				default: // Item
					return 'I';
				break;
			}
		}

	}
	
?>

Viewing all articles
Browse latest Browse all 13200

Trending Articles