<?php  																														require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	$App 	= new App();	$Nav	= new Nav();	$Menu 	= new Menu(); $theme = "Phoenix";	   # All on the same line to unclutter the user's desktop'

	#*****************************************************************************
	#
	# index.php
	#
	# Author: 	 	Nathan Gervais
	# Date:			2008-04-21
	#
	# Description: Ganymede Landing Page
	#
	#****************************************************************************
	
	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "Ganymede Around the World";
	$pageKeywords	= "eclipse ganymede, ganymede, ganymede around the world";
	$pageAuthor		= "Nathan Gervais";
	header("Cache-control: no-cache");
	# Add page-specific Nav bars here
	# Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank)
	# $Nav->addCustomNav("My Link", "mypage.php", "_self");
	# $Nav->addCustomNav("Google", "http://www.google.com/", "_blank");

	# End: page-specific settings
	#
	function displayPager($_start, $_pageValue, $_pageCount)
	{
		ob_start();
		?>
		<table width="700">
				<tr>
					<td align="left">
				<?
					if ($_start >= $_pageValue)
					{
						?><a href="mapList.php?start=<?=$_start-$_pageValue;?>"><< Previous Page</a><?
					}
				?>&nbsp;</td>
					<td align="right">
				<?
					if (($_start + $_pageValue) < $_pageCount)
					{
						?><a href="mapList.php?start=<?=$_start+$_pageValue;?>">Next Page >></a><?
					}
				?>
					</td>
				</tr>
			</table>
		<?
		return ob_get_clean();
	}	
	if (isset($_GET['start']))
		$start = $_GET['start'];
	else 
		$start = 0;
	$pageValue = 25;
	$pager = " LIMIT $start, $pageValue";
	
	# Place your html content in a file called content/en_pagename.php
	include ($_SERVER['DOCUMENT_ROOT'] . '/eclipse.org-common/system/smartconnection.class.php');
	$dbc = new DBConnection();
	$dbh = $dbc->connect();
	
	if (isset($_GET['sort'])) {
		$sortBy = " ORDER BY " . $_GET['sort'] . " ASC";
	}
	else 
		$sortBy = " ORDER BY GS.id DESC";
	
	$sql = "SELECT count(*) AS count FROM ganymede_spots";
	$result = mysql_fetch_array(mysql_query($sql));
	$count = $result['count'];
		
	$sql = "SELECT * FROM ganymede_spots AS GS INNER JOIN ganymede_content AS GC ON GS.id = GC.id" . $sortBy . $pager;
	$result = mysql_query($sql);
	
	ob_start();
	?>
	<link type="text/css" href="../style.css" rel="stylesheet"/>
	<body>
		<div id="midcolumn">
  			<h1><?=$pageTitle;?></h1><br/>
  			<?=displayPager($start, $pageValue, $count);?>
			<table cellspacing=0 cellpadding=0 class="list" width="700">
				<tr class="header">	
					<td width="200"><a href="<?$_SERVER['PHP_SELF'];?>?sort=name">Name</a></td>
					<td width="200"><a href="<?$_SERVER['PHP_SELF'];?>?sort=location_country">Location</a></td>
					<td width="300">Content</td>
					<td>Email</td>
				</tr>
				<? while ($rr = mysql_fetch_array($result)) { ?>
				<tr>
					<td><?=$rr['name']; ?></td>
					<td><?=$rr['location_city'];?>, <?=$rr['location_country'];?></td>
					<td>
						<? echo ucfirst($rr['type']) . " ";
						$url = $rr['url'];
						if ($url == "http://") {
							$url = "";	
						}
						if ($url != "") {
							if (strpos($url, 'http://') === FALSE) {
								$url = "http://" . $url;
							}
						}
						
						if (($rr['title'] == "") && ($url == "")) { //We have no title or URL -> Break
							echo "<br/>";
						}
						elseif (($url == "") && ($rr['title'] !="")) { // We have no url field -> echo Title 
							echo " - " . $rr['title']. '<br/>';
						}
						elseif (($rr['title'] == "") && ($url !="")) { // We have no title field -> echo URL
							echo ' - <a href="'.$url.'" target="_blank">' .$url. '</a><br/>'; 								
						}
						else { //We must have both.
							echo ' - <a href="'.$url.'" target="_blank">' .$rr['title']. '</a><br/>'; 
						}
						echo $rr['content'];
						?>
					</td>
					<td><?=$rr['email'];?></td>
				</tr>
				<? } ?>	
			</table>
			<?=displayPager($start, $pageValue, $count);?><br/><br/>
		</div>
		<div id="rightcolumn">
			<div class="sideitem">
				<h6>Ganymede Around the World</h6>
					<ul>
						<li><a href="./">Ganymede</a></li>
						<li><a href="./map.php">Ganymede Map</a></li>
						<li><a href="./aroundtheworld.php">Contest Details</a></li>
					</ul>
			</div>
		</div>
 	</body>
	<?
	$html = ob_get_clean();
	# Generate the web page
	$App->Promotion = TRUE;
	$App->generatePage($theme, $Menu, NULL, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>