<?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();		include($App->getProjectCommon());    # All on the same line to unclutter the user's desktop'
/*******************************************************************************
 * Copyright (c) 2009-2010 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    
 *******************************************************************************/

	#
	# Begin: page-specific settings.  Change these. 
	$pageTitle 		= "Eclipse.org - Indigo Simultaneous Release";
	$pageKeywords	= "indigo, release, simultaneous, release train, 3.7";
	$pageAuthor		= "Nathan Gervais";
		
	# Paste your HTML content between the EOHTML markers!	
	ob_start();
	?>
	<div id="fullcolumn" class="indigo">
		<a href="/indigo"><img id="indigoLogo" src="images/indigologo.png"/></a>
		<div id="container">
		
			<div id="nav">
				<ul>
					<li><a href="/downloads/index-developer.php">Downloads</a></li>
					<li><a href="projects.php">Projects</a></li>
					<li><a href="http://wiki.eclipse.org/Eclipse_DemoCamps_Indigo_2011">DemoCamps</a></li>
					<li class="last"><a href="friends.php">The Indigo 500</a></li>
				</ul>
			</div>
			<div id="window">
			<div class="whiteout"><p class="bang"><img class="bang" src="images/bang.png"/></p>
			<p class="indigo">Indigo is the annual release of Eclipse projects on June&nbsp;22&nbsp;2011; <br/>this year 62 project teams are part of the release.</p> 
					</div>
				<h4 class="highlights">Highlights</h4>
				<ul id="ticker"></ul>
				<ul id="hide"></ul>
			
				<span class="train"><a style="color:#FFF;" href="/home">Click here to continue to Eclipse.org</a> </p></span>
			</div>
		</div>
	</div>
	
	<script>
	var t = 0;
	var s = 4;
	var interval = 5000;
	var c = 0;
	$.getJSON('highlights.php', function (data) {
		var ul = $('<ul/>');
		var tul = $('<ul/>');
		$.each(data, function(key, val) {
			c++;
			if (c <= s) {
				$('<li/>', { html: val, }).appendTo(tul);
			}
			$('<li/>', { text: val, }).appendTo(ul);
		});
		
		$('#hide').append(ul.contents());
		$('#ticker').append(tul.contents());
	})
	.error(function() { alert('invalid'); }
	);
	t = setTimeout(tick, interval);
	function tick() {
		smoothAdd('ticker',$('#hide li:last').text());
		$('#hide').prepend($('#hide li:last'));
				
		t = setTimeout(tick, interval);
	}
	</script>
		
	
	<?
	$html = ob_get_clean();

	# Generate the web page
	$App->Promotion = TRUE;
	$App->AddExtraHtmlHeader('<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js"></script>');
	$App->AddExtraHtmlHeader('<script type="text/javascript" src="scripts/smooth-add.js"></script>');
	$App->AddExtraHtmlHeader('<link type="text/css" href="/indigo/style.css" rel="stylesheet"/>');	
	$App->generatePage('Nova', $Menu, NULL , $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
