<?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'

#*****************************************************************************
#
# functions.php
#
# Author: 		Yossi Mesika, Stefan Edlund
# Date:			2009-07-19
#
# Description: Common functions for STEM web page
#
#****************************************************************************

#
# Begin: page-specific settings.  Change these.
	function getFeedContents($rssUrl, $cacheFile)
	{
#		$cacheFile = $_SERVER['DOCUMENT_ROOT'] . "/stem/data/rss_cache.xml";
#		$rssUrl = "http://www.eclipse.org/forums/rdf.php?mode=m&l=1&basic=1&frm=72&n=5";
		
		$rssData = "";
		
#		if (file_exists($cacheFile) && @filemtime($cacheFile) + 86400 > time()) {
#			$rssData = @file_get_contents($cacheFile);
#		} else {
			$rssData = @file_get_contents($rssUrl);
			if (!empty($rssData)) {
				@file_put_contents($cacheFile, $rssData);
			} else {
				// If we have a failed retrieve, set cache file mod time to 12 hours behind current epoch.
				// This will delay cache timeout for another 12 hours.  Fail safe to prevent 
				// latency on _all_ page reloads in the event of infrastructure problems.
				@touch($cacheFile, time() - 43200);
			}
#		}
		
		return $rssData;
		
	}

	function getRssFeed($rssUrl, $cacheFile)
	{
		
		
		//$rssFilePath = $_SERVER['DOCUMENT_ROOT'] . "/stem/feeds/news.xml";

		$xmlData = getFeedContents($rssUrl, $cacheFile);

		if (empty($xmlData)) {
			return;
		}

		$xmlResult = new SimpleXMLElement($xmlData);

		$rssResults = $xmlResult->item;

		$rssMaxResults = 5;


		if (sizeof($rssResults) > 0) {
			$rssCount = 0;
			foreach ($rssResults as $rssResult) {
				if ($rssCount >= $rssMaxResults) {
					break;
				}

				$title = $rssResult->title;
				$url = $rssResult->link;

				$ns_dc = $rssResult->children("http://purl.org/dc/elements/1.1/");
				$date = strtotime($ns_dc->date);
				if (!$date || $date === -1) {
					$date = time();
				}
				$formattedDate = date('d-M y', $date);
				echo "<img src=\"images/arrow.jpg\" width=\"11\" height=\"10\" alt=\"\" border=\"0\">&nbsp;" .$formattedDate . ": &nbsp;<a href=\"". $url ."\" target=\"_blank\">". $title ."</a><br />";

				$rssCount++;
			}
		}
	}

	function getData($file, $maxresults, $icon)
	{
		$filePath = $_SERVER['DOCUMENT_ROOT'] . $file;

		$xmlData = file_get_contents($filePath);

		$xmlResult = new SimpleXMLElement($xmlData);

		$results = $xmlResult->item;

		echo $results;
		if (sizeof($results) > 0) {
			$count = 0;
			foreach ($results as $result) {
				if ($maxresults != -1 && $count >= $maxresults) {
					break;
				}

				$title = $result->title;
				$url = $result->link;
				$authors = $result->authors;
				$source = $result->source;
				$other = $result->other;
				$image = $result->image;
				
				$markup = "";
				if(!empty($image)) {
					$markup = $markup. "<img src=\"". $image ."\" style=\"float: left;width:150px;\"/>";
				}
				if(!empty($authors))
				   $markup = $markup. $authors. "&nbsp;";
				if(!empty($url)) {
					$markup = $markup. "<a href=\"". $url ."\" target=\"_blank\">";
					if(!empty($icon)) $markup = $markup. "<img border=0 src=\"". $icon . "\">&nbsp;";
			    }
				if(!empty($title))
					$markup = $markup. $title."</a>&nbsp;";
				if(!empty($source))
					$markup = $markup. "<div style=\"font-style: italic;\">".$source."</div>";
				if(!empty($other))
					$markup = $markup. "&nbsp;" . $other;
				$markup = $markup . "<br/>";

				echo $markup;
				$count++;
			}
		}
	}
	
?>