<?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 coming 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">Click <a style="color:#FFF;" href="http://wiki.eclipse.org/Simultaneous_Release">here</a> to find out about the newest Eclipse Simultaneous Release</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);
?>
