<?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">Click <a style="color:#FFF;" href="/home">here</a> to continue to Eclipse.org</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);
?>
