From 695cb58b04618d275982d502ca25cc879df3fead Mon Sep 17 00:00:00 2001
From: Znote <stefan_brannfjell@live.no>
Date: Mon, 30 Jan 2017 06:48:46 +0100
Subject: [PATCH] Added shop categories, mounts and outfits. Display outfits
 currently only work in shop.

---
 .../talkaction shopsystem/znoteshop.lua       |  27 +-
 .../Alternatives/znoteshop.lua                |  38 ++-
 .../talkaction shopsystem/znoteshop.lua       |  36 ++-
 .../talkaction shopsystem/znoteshop.lua       |  38 ++-
 config.php                                    |  87 ++++--
 layout/css/style.css                          |  24 ++
 shop.php                                      | 251 ++++++++++++++++--
 7 files changed, 440 insertions(+), 61 deletions(-)

diff --git a/LUA/TFS_02/talkaction shopsystem/znoteshop.lua b/LUA/TFS_02/talkaction shopsystem/znoteshop.lua
index 3841348..99838f3 100644
--- a/LUA/TFS_02/talkaction shopsystem/znoteshop.lua	
+++ b/LUA/TFS_02/talkaction shopsystem/znoteshop.lua	
@@ -32,11 +32,30 @@ function onSay(cid, words, param)
 						doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Need more CAP!")
 					end
 			end
+			-- ORDER TYPE 5 (Outfit and addon)
+			if q_type == 5 then
+				-- Make sure player don't already have this outfit and addon
+				if not canPlayerWearOutfit(cid, q_itemid, q_count) then
+					db.query("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					doPlayerAddOutfit(cid,q_itemid,q_count)
+					doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have received a new outfit!")
+				else
+					doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You already have this outfit and addon!")
+				end
+			end
+
+			-- ORDER TYPE 6 (Mounts)
+			-- Not supported on TFS 0.2
+			
 			-- Add custom order types here
-			-- Type 2 is reserved for premium days and is handled on website, not needed here.
-			-- Type 3 is reserved for character gender(sex) change and is handled on website as well.
-			-- So use type 4+ for custom stuff, like etc packages.
-			-- if q_type == 4 then
+			-- Type 1 is for itemids (Already coded here)
+			-- Type 2 is for premium (Coded on web)
+			-- Type 3 is for gender change (Coded on web)
+			-- Type 4 is for character name change (Coded on web)
+			-- Type 5 is for character outfit and addon (Already coded here)
+			-- Type 6 is for mounts (Not for TFS 0.2)
+			-- So use type 7+ for custom stuff, like etc packages.
+			-- if q_type == 7 then
 			-- end
 		else
 			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have no orders.")
diff --git a/LUA/TFS_03/talkaction shopsystem/Alternatives/znoteshop.lua b/LUA/TFS_03/talkaction shopsystem/Alternatives/znoteshop.lua
index f6d3c70..8ccf492 100644
--- a/LUA/TFS_03/talkaction shopsystem/Alternatives/znoteshop.lua	
+++ b/LUA/TFS_03/talkaction shopsystem/Alternatives/znoteshop.lua	
@@ -33,11 +33,41 @@ function onSay(cid, words, param)
 						doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Need more CAP!")
 					end
 			end
+			-- ORDER TYPE 5 (Outfit and addon)
+			if q_type == 5 then
+				-- Make sure player don't already have this outfit and addon
+				if not canPlayerWearOutfit(cid, q_itemid, q_count) then
+					local delete = db.storeQuery("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					result.free(delete)
+					doPlayerAddOutfit(cid,q_itemid,q_count)
+					doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have received a new outfit!")
+				else
+					doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You already have this outfit and addon!")
+				end
+			end
+
+			-- ORDER TYPE 6 (Mounts)
+			if q_type == 6 then
+				-- Make sure player don't already have this outfit and addon
+				if not getPlayerMount(cid, q_itemid) then -- Failed to find a proper hasMount 0.3 function?
+					local delete = db.storeQuery("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					result.free(delete)
+					doPlayerAddMount(cid, q_itemid)
+					doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have received a new mount!")
+				else
+					doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You already have this mount!")
+				end
+			end
+			
 			-- Add custom order types here
-			-- Type 2 is reserved for premium days and is handled on website, not needed here.
-			-- Type 3 is reserved for character gender(sex) change and is handled on website as well.
-			-- So use type 4+ for custom stuff, like etc packages.
-			-- if q_type == 4 then
+			-- Type 1 is for itemids (Already coded here)
+			-- Type 2 is for premium (Coded on web)
+			-- Type 3 is for gender change (Coded on web)
+			-- Type 4 is for character name change (Coded on web)
+			-- Type 5 is for character outfit and addon (Already coded here)
+			-- Type 6 is for mounts (Already coded here)
+			-- So use type 7+ for custom stuff, like etc packages.
+			-- if q_type == 7 then
 			-- end
 		else
 			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have no orders.")
diff --git a/LUA/TFS_03/talkaction shopsystem/znoteshop.lua b/LUA/TFS_03/talkaction shopsystem/znoteshop.lua
index 40a7587..480a91c 100644
--- a/LUA/TFS_03/talkaction shopsystem/znoteshop.lua	
+++ b/LUA/TFS_03/talkaction shopsystem/znoteshop.lua	
@@ -43,11 +43,39 @@ function onSay(cid, words, param)
 						doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Need more CAP and Need ProtectZone!")
 					end
 			end
+			-- ORDER TYPE 5 (Outfit and addon)
+			if q_type == 5 then
+				-- Make sure player don't already have this outfit and addon
+				if not canPlayerWearOutfit(cid, q_itemid, q_count) then
+					db.executeQuery("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					doPlayerAddOutfit(cid,q_itemid,q_count)
+					doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have received a new outfit!")
+				else
+					doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You already have this outfit and addon!")
+				end
+			end
+
+			-- ORDER TYPE 6 (Mounts)
+			if q_type == 6 then
+				-- Make sure player don't already have this outfit and addon
+				if not getPlayerMount(cid, q_itemid) then -- Failed to find a proper hasMount 0.3 function?
+					db.executeQuery("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					doPlayerAddMount(cid, q_itemid)
+					doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have received a new mount!")
+				else
+					doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You already have this mount!")
+				end
+			end
+			
 			-- Add custom order types here
-			-- Type 2 is reserved for premium days and is handled on website, not needed here.
-			-- Type 3 is reserved for character gender(sex) change and is handled on website as well.
-			-- So use type 4+ for custom stuff, like etc packages.
-			-- if q_type == 4 then
+			-- Type 1 is for itemids (Already coded here)
+			-- Type 2 is for premium (Coded on web)
+			-- Type 3 is for gender change (Coded on web)
+			-- Type 4 is for character name change (Coded on web)
+			-- Type 5 is for character outfit and addon (Already coded here)
+			-- Type 6 is for mounts (Already coded here)
+			-- So use type 7+ for custom stuff, like etc packages.
+			-- if q_type == 7 then
 			-- end
 		else
 			doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have no orders.")
diff --git a/LUA/TFS_10/talkaction shopsystem/znoteshop.lua b/LUA/TFS_10/talkaction shopsystem/znoteshop.lua
index 32b24d3..b3b88bd 100644
--- a/LUA/TFS_10/talkaction shopsystem/znoteshop.lua	
+++ b/LUA/TFS_10/talkaction shopsystem/znoteshop.lua	
@@ -29,11 +29,41 @@ function onSay(player, words, param)
 					player:sendTextMessage(MESSAGE_STATUS_WARNING, "Need more CAP!")
 				end
 			end
+
+			-- ORDER TYPE 5 (Outfit and addon)
+			if q_type == 5 then
+				-- Make sure player don't already have this outfit and addon
+				if not player:hasOutfit(q_itemid, q_count) then
+					db.query("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					player:addOutfit(q_itemid)
+					player:addOutfitAddon(q_itemid, q_count)
+					player:sendTextMessage(MESSAGE_INFO_DESCR, "Congratulations! You have received a new outfit!")
+				else
+					player:sendTextMessage(MESSAGE_STATUS_WARNING, "You already have this outfit and addon!")
+				end
+			end
+
+			-- ORDER TYPE 6 (Mounts)
+			if q_type == 6 then
+				-- Make sure player don't already have this outfit and addon
+				if not player:hasMount(q_itemid) then
+					db.query("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
+					player:addMount(q_itemid)
+					player:sendTextMessage(MESSAGE_INFO_DESCR, "Congratulations! You have received a new mount!")
+				else
+					player:sendTextMessage(MESSAGE_STATUS_WARNING, "You already have this mount!")
+				end
+			end
+			
 			-- Add custom order types here
-			-- Type 2 is reserved for premium days and is handled on website, not needed here.
-			-- Type 3 is reserved for character gender(sex) change and is handled on website as well.
-			-- So use type 4+ for custom stuff, like etc packages.
-			-- if q_type == 4 then
+			-- Type 1 is for itemids (Already coded here)
+			-- Type 2 is for premium (Coded on web)
+			-- Type 3 is for gender change (Coded on web)
+			-- Type 4 is for character name change (Coded on web)
+			-- Type 5 is for character outfit and addon (Already coded here)
+			-- Type 6 is for mounts (Already coded here)
+			-- So use type 7+ for custom stuff, like etc packages.
+			-- if q_type == 7 then
 			-- end
 		else
 			player:sendTextMessage(MESSAGE_STATUS_WARNING, "You have no orders.")
diff --git a/config.php b/config.php
index a42cb16..d380918 100644
--- a/config.php
+++ b/config.php
@@ -568,6 +568,17 @@
 		'server' => 'http://flag.znote.eu'
 	);
 
+	// Show outfits
+	$config['show_outfits'] = array(
+		'shop' => true,
+		'highscores' => false, // Not implemented yet
+		'characterprofile' => false, // Not implemented yet
+		'onlinelist' => false, // Not implemented yet
+		// Image server may be unreliable and only for test,
+		// host yourself: https://otland.net/threads/item-images-10-92.242492/
+		'imageServer' => 'http://outfit-images.ots.me/animatedOutfits1090/animoutfit.php'
+	);
+
 	// Level requirement to create guild? (Just set it to 1 to allow all levels).
 	$config['create_guild_level'] = 8;
 
@@ -898,56 +909,86 @@
 		// sellable before auctioneer can claim character back.
 	);
 
-	// If useDB is false, this array list will be used for shop offers.
+	/*
+		type 1 = items
+		type 2 = Premium days
+		type 3 = Change character gender
+		type 4 = Change character name
+		type 5 = Buy outfit (put outfit id as itemid), 
+		(put addon id as count [0 = nothing, 1 = first addon, 2 = second addon, 3 = both addons])
+		type 6 = Buy mount (put mount id as itemid)
+		type 7+ = custom coded stuff
+	*/
 	$config['shop_offers'] = array(
-		// offer 1
 		1 => array(
-			'type' => 1, // 1 = item id offers, 2 = premium days [itemid ignored], 3 = sex change[itemid & count ignored], 4+ = custom.
+			'type' => 1,
 			'itemid' => 2160, // item to get in-game
-			'count' => 5, //if type is 2, this represents premium days
-			'description' => "Crystal coin.", // Description shown on website
+			'count' => 5, // Stack number (5x itemid)
+			'description' => "Crystal coin", // Description shown on website
 			'points' => 100, // How many points this offer costs
 		),
-
-		// offer 2
 		2 => array(
 			'type' => 1,
 			'itemid' => 2392,
 			'count' => 1,
-			'description' => "Fire sword.",
+			'description' => "Fire sword",
 			'points' => 10,
 		),
-
-		// offer 3
 		3 => array(
 			'type' => 2,
 			'itemid' => 12466, // Item to display on page
-			'count' => 7,
-			'description' => "Premium membership.",
+			'count' => 7, // Days of premium account
+			'description' => "Premium membership",
 			'points' => 25,
 		),
-
-		// offer 4
 		4 => array(
 			'type' => 3,
-			'itemid' => 12666,
+			'itemid' => 12666, // Item to display on page
 			'count' => 3,
-			'description' => "Change character gender.",
+			'description' => "Change character gender",
 			'points' => 10,
 		),
 		5 => array(
 			'type' => 3,
-			'itemid' => 12666,
-			'count' => 0,
-			'description' => "Change character gender.",
+			'itemid' => 12666, // Item to display on page
+			'count' => 0, // 0 = unlimited
+			'description' => "Change character gender",
 			'points' => 20,
 		),
-		5 => array(
+		6 => array(
 			'type' => 4,
-			'itemid' => 12666,
+			'itemid' => 12666, // Item to display on page
 			'count' => 1,
-			'description' => "Change character name.",
+			'description' => "Change character name",
+			'points' => 20,
+		),
+		7 => array(
+			'type' => 5,
+			'itemid' => 132, // Outfit ID
+			'count' => 3, // Addon 0 = none, 1 = first, 2 = second, 3 = both
+			'description' => "Nobleman with both addons",
+			'points' => 20,
+		),
+		8 => array(
+			'type' => 5,
+			'itemid' => 140,
+			'count' => 3,
+			'description' => "Noblewoman with both addons",
+			'points' => 20,
+		),
+		9 => array(
+			'type' => 6,
+			'itemid' => 32, // Mount ID
+			'count' => 1,
+			'description' => "Gnarlhound mount",
+			'points' => 20,
+		),
+		10 => array(
+			'type' => 6,
+			'itemid' => 17,
+			'count' => 1,
+			'description' => "War horse",
 			'points' => 20,
 		),
 	);
-?>
+?>
\ No newline at end of file
diff --git a/layout/css/style.css b/layout/css/style.css
index bc8bcac..e29f6ec 100644
--- a/layout/css/style.css
+++ b/layout/css/style.css
@@ -653,4 +653,28 @@ div.aspectratio > iframe {
   top: 0; bottom: 0; left: 0; right: 0;
   width: 100%;
   height: 100%;
+}
+
+/* SHOP Category style */
+#categoryNavigator {
+  background-color: #555555;
+  max-width: 650px;
+  margin-top: 20px;
+}
+
+#categoryNavigator a {
+  color: white;
+  font-weight: bold;
+  padding: 10px 15px;
+  display: inline-block;
+  text-decoration: none;
+  border-right: 1px solid #E5E5DB;
+}
+
+#categoryNavigator a:hover {
+  background-color: #ad7400;
+}
+
+table.hide {
+  display: none;
 }
\ No newline at end of file
diff --git a/shop.php b/shop.php
index 6b0f8f7..34cea90 100644
--- a/shop.php
+++ b/shop.php
@@ -87,8 +87,215 @@ if ($config['shop_auction']['characterAuction']) {
 	<p>Interested in buying characters? View the <a href="auctionChar.php">character auction page!</a></p>
 	<?php
 }
+
+$outfitsIds = array(136,137,138,139,140,141,142,147,148,149,150,155,156,157,158,252,269,270,279,288,324,336,366,431,433,464,466,471,513,514,542,128,129,130,131,132,133,134,143,144,145,146,151,152,153,154,251,268,273,278,289,325,335,367,430,432,463,465,472,512,516,541);
+$category_items = array();
+$category_premium = array();
+$category_outfits = array();
+$category_mounts = array();
+$category_misc = array();
+foreach ($shop_list as $key => $offer) {
+	
+	switch ($offer['type']) {
+		case 1:
+			$category_items[$key] = $offer;
+		break;
+		case 2:
+			$category_premium[$key] = $offer;
+		break;
+		case 3:
+			$category_misc[$key] = $offer;
+		break;
+		case 4:
+			$category_misc[$key] = $offer;
+		break;
+		case 5:
+			$category_outfits[$key] = $offer;
+		break;
+		case 6:
+			$category_mounts[$key] = $offer;
+		break;
+		default:
+			$category_misc[$key] = $offer;
+		break;
+	}
+}
+
+// Render a bunch of tables (one for each category)
 ?>
-<table>
+<div id="categoryNavigator">
+	<a class="nav_link" href="#all">ALL</a>
+	<a class="nav_link" href="#cat_itemids">ITEMS</a>
+	<a class="nav_link" href="#cat_premium">PREMIUM</a>
+	<a class="nav_link" href="#cat_outfits">OUTFITS</a>
+	<a class="nav_link" href="#cat_mounts">MOUNTS</a>
+	<a class="nav_link" href="#cat_misc">MISC</a>
+</div>
+<script type="text/javascript">
+	function domReady () {
+		var links = document.getElementsByClassName("nav_link");
+		for (var i=0; i < links.length; i++) {
+			links[i].addEventListener('click', function(e){
+				e.preventDefault();
+				// Hide all tables
+				for (var x=0; x < links.length; x++) {
+					var hash = links[x].hash.substr(1);
+					if (hash != 'all') {
+						var table = document.getElementById(hash);
+						if (table.classList.contains("show")) {
+							table.classList.remove("show");
+							table.classList.add("hide");
+						}
+					}
+				}
+				// Display only the one we selected
+				var hash = this.hash.substr(1);
+				if (hash != 'all') {
+					var target = document.getElementById(hash);
+					if (target.classList.contains('hide')) {
+						target.classList.remove("hide");
+						target.classList.add("show");
+					}
+				} else { // We clicked to show all tables
+					// Show all tables
+					for (var x=0; x < links.length; x++) {
+						var hash = links[x].hash.substr(1);
+						if (hash != 'all') {
+							var table = document.getElementById(hash);
+							if (table.classList.contains("hide")) {
+								table.classList.remove("hide");
+								table.classList.add("show");
+							}
+						}
+					}
+				}
+			});
+		}
+	}
+	// Mozilla, Opera, Webkit 
+	if ( document.addEventListener ) {
+		document.addEventListener( "DOMContentLoaded", function(){
+		document.removeEventListener( "DOMContentLoaded", arguments.callee, false);
+		domReady();
+	  }, false );
+	// If IE event model is used
+	} else if ( document.attachEvent ) {
+		// ensure firing before onload
+		document.attachEvent("onreadystatechange", function(){
+		if ( document.readyState === "complete" ) {
+			document.detachEvent( "onreadystatechange", arguments.callee );
+			domReady();
+		}
+		});
+	}
+</script>
+
+<!-- ITEMIDS -->
+<table class="show" id="cat_itemids">
+	<tr class="yellow">
+		<td>Item:</td>
+		<?php if ($config['shop']['showImage']) { ?><td>Image:</td><?php } ?>
+		<td>Count:</td>
+		<td>Points:</td>
+		<td>Action:</td>
+	</tr>
+	<?php foreach ($category_items as $key => $offers): ?>
+		<tr class="special">
+			<td><?php echo $offers['description']; ?></td>
+			<?php if ($config['shop']['showImage']):?>
+				<td><img src="http://<?php echo $config['shop']['imageServer']; ?>/<?php echo $offers['itemid']; ?>.<?php echo $config['shop']['imageType']; ?>" alt="img"></td>
+			<?php endif; ?>
+			<td><?php echo $offers['count']; ?>x</td>
+			<td><?php echo $offers['points']; ?></td>
+			<td>
+				<form action="" method="POST">
+					<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
+					<input type="hidden" name="session" value="<?php echo time(); ?>">
+					<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
+				</form>
+			</td>
+		</tr>
+	<?php endforeach; ?>
+</table>
+<!-- PREMIUM DURATION -->
+<table class="show" id="cat_premium">
+	<tr class="yellow">
+		<td>Description:</td>
+		<?php if ($config['shop']['showImage']) { ?><td>Image:</td><?php } ?>
+		<td>Duration:</td>
+		<td>Points:</td>
+		<td>Action:</td>
+	</tr>
+	<?php foreach ($category_premium as $key => $offers): ?>
+		<tr class="special">
+			<td><?php echo $offers['description']; ?></td>
+			<?php if ($config['shop']['showImage']):?>
+				<td><img src="http://<?php echo $config['shop']['imageServer']; ?>/<?php echo $offers['itemid']; ?>.<?php echo $config['shop']['imageType']; ?>" alt="img"></td>
+			<?php endif; ?>
+			<td><?php echo $offers['count']; ?> Days</td>
+			<td><?php echo $offers['points']; ?></td>
+			<td>
+				<form action="" method="POST">
+					<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
+					<input type="hidden" name="session" value="<?php echo time(); ?>">
+					<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
+				</form>
+			</td>
+		</tr>
+	<?php endforeach; ?>
+</table>
+<!-- OUTFITS -->
+<table class="show" id="cat_outfits">
+	<tr class="yellow">
+		<td>Description:</td>
+		<?php if ($config['shop']['showImage']) { ?><td>Image:</td><?php } ?>
+		<td>Points:</td>
+		<td>Action:</td>
+	</tr>
+	<?php foreach ($category_outfits as $key => $offers): ?>
+		<tr class="special">
+			<td><?php echo $offers['description']; ?></td>
+			<?php if ($config['show_outfits']['shop']):?>
+				<td><img src="<?php echo $config['show_outfits']['imageServer']; ?>?id=<?php echo $offers['itemid']; ?>&addons=<?php echo $offers['count']; ?>&head=<?php echo rand(1, 132); ?>&body=<?php echo rand(1, 132); ?>&legs=<?php echo rand(1, 132); ?>&feet=<?php echo rand(1, 132); ?>" alt="img"></td>
+			<?php endif; ?>
+			<td><?php echo $offers['points']; ?></td>
+			<td>
+				<form action="" method="POST">
+					<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
+					<input type="hidden" name="session" value="<?php echo time(); ?>">
+					<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
+				</form>
+			</td>
+		</tr>
+	<?php endforeach; ?>
+</table>
+<!-- MOUNTS -->
+<table class="show" id="cat_mounts">
+	<tr class="yellow">
+		<td>Description:</td>
+		<?php if ($config['show_outfits']['shop']) { ?><td>Image:</td><?php } ?>
+		<td>Points:</td>
+		<td>Action:</td>
+	</tr>
+	<?php foreach ($category_mounts as $key => $offers): ?>
+		<tr class="special">
+			<td><?php echo $offers['description']; ?></td>
+			<?php if ($config['shop']['showImage']):?>
+				<td><img src="<?php echo $config['show_outfits']['imageServer']; ?>?id=<?php echo $outfitsIds[rand(0,count($outfitsIds)-1)]; ?>&addons=<?php echo rand(1, 3); ?>&head=<?php echo rand(1, 132); ?>&body=<?php echo rand(1, 132); ?>&legs=<?php echo rand(1, 132); ?>&feet=<?php echo rand(1, 132); ?>&mount=<?php echo $offers['itemid']; ?>&direction=2" alt="img"></td>
+			<?php endif; ?>
+			<td><?php echo $offers['points']; ?></td>
+			<td>
+				<form action="" method="POST">
+					<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
+					<input type="hidden" name="session" value="<?php echo time(); ?>">
+					<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
+				</form>
+			</td>
+		</tr>
+	<?php endforeach; ?>
+</table>
+<!-- MISCELLANEOUS -->
+<table class="show" id="cat_misc">
 	<tr class="yellow">
 		<td>Description:</td>
 		<?php if ($config['shop']['showImage']) { ?><td>Image:</td><?php } ?>
@@ -96,27 +303,27 @@ if ($config['shop_auction']['characterAuction']) {
 		<td>Points:</td>
 		<td>Action:</td>
 	</tr>
-		<?php
-		foreach ($shop_list as $key => $offers) {
-		echo '<tr class="special">';
-		echo '<td>'. $offers['description'] .'</td>';
-		if ($config['shop']['showImage']) echo '<td><img src="http://'. $config['shop']['imageServer'] .'/'. $offers['itemid'] .'.'. $config['shop']['imageType'] .'" alt="img"></td>';
-		if ($offers['type'] == 2) echo '<td>'. $offers['count'] .' Days</td>';
-		else if ($offers['type'] == 3 && $offers['count'] == 0) echo '<td>Unlimited</td>';
-		else echo '<td>'. $offers['count'] .'x</td>';
-		echo '<td>'. $offers['points'] .'</td>';
-		echo '<td>';
-		?>
-		<form action="" method="POST">
-			<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
-			<input type="hidden" name="session" value="<?php echo time(); ?>">
-			<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
-		</form>
-		<?php
-		echo '</td>';
-		echo '</tr>';
-		}
-		?>
+	<?php foreach ($category_misc as $key => $offers): ?>
+		<tr class="special">
+			<td><?php echo $offers['description']; ?></td>
+			<?php if ($config['shop']['showImage']):?>
+				<td><img src="http://<?php echo $config['shop']['imageServer']; ?>/<?php echo $offers['itemid']; ?>.<?php echo $config['shop']['imageType']; ?>" alt="img"></td>
+			<?php endif;
+			if ($offers['count'] === 0): ?>
+				<td>Unlimited</td>
+			<?php else: ?>
+				<td><?php echo $offers['count']; ?>x</td>
+			<?php endif; ?>
+			<td><?php echo $offers['points']; ?></td>
+			<td>
+				<form action="" method="POST">
+					<input type="hidden" name="buy" value="<?php echo (int)$key; ?>">
+					<input type="hidden" name="session" value="<?php echo time(); ?>">
+					<input type="submit" value="  PURCHASE  "  class="needconfirmation" data-item-name="<?php echo $offers['description']; ?>" data-item-cost="<?php echo $offers['points']; ?>">
+				</form>
+			</td>
+		</tr>
+	<?php endforeach; ?>
 </table>
 
 <?php if ($shop['enableShopConfirmation']) { ?>