<?php

    /* Required eclipse basic classes */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");	
    /* Functions and modules related to Navbar objects */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php"); 	
    /* Functions and modules related to the page top eclipse menu */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php"); 	
    /* Functions used for display events */
    require_once($_SERVER['DOCUMENT_ROOT'] . "/dsdp/mtj/events.func.php");
    
    $App 	= new App();
    /* Left Navbar */	
    $Nav	= new Nav();	
    /*  Page top eclipse menu */
    $Menu 	= new Menu();

    /* Find the _projectCommon.php file and include it */
    include($App->getProjectCommon());

	
	/* Begin: page-specific settings. */ 
	$pageTitle 		= "DSDP&nbsp; - &nbsp;Mobile Tools for Java &nbsp; (MTJ) &nbsp; Mailing List";
	$pageKeywords	= "mobile, tools, Java, runtime, design, framework, ";
	$pageAuthor		= "Diego Madruga Sandin";
	
	/* 
	 * Add page-specific Nav bars here.
	 * Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
	 * 
	 * Examples:
	 *   $Nav->addNavSeparator("My Page Links", 	"downloads.php"); 
	 *   $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
	 *   $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);
	 */

	/* Generate Events content according to the 2008 year */
    $events = generateContent("2008","Events","homeitem");

	
	/* End: page-specific settings */
	# Paste your HTML content between the EOHTML markers!	
	$html = <<<EOHTML
	<div id="maincontent">
	
		<div id="midcolumn"> 
		    <!-- Project description -->
			<h1>$pageTitle</h1>
    		<div class="homeitem3col">
    		<h3>Developer Mailing List</h3>
            <ul>
            	<br>
                <li>
                    For project development discussions join the <a href="https://dev.eclipse.org/mailman/listinfo/dsdp-mtj-dev">dsdp-mtj-dev</a> mailing list
                </li>
                <br>
                <li>
                 	To access a web archive of this list, visit the 
					<a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-dev/">dsdp-mtj-dev
		  			Archives</a>.(<i>The current archive is only available to the list members.</i>)
    				<ul>
                        <li>
                        	<a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-dev/maillist.html">Index by date</a>  
                        </li>
                        <li>
                        <a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-dev/threads.html">Index by thread</a>  
                        </li>
                    </ul>
                </li>
                <br>
                <li>
                  You can subscribe to the list's RSS feed <a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-dev/maillist.rss">
                  <img src="http://www.eclipse.org/eclipse.org-common/themes/Phoenix/images/rss_btn.gif"></a>
                </li>
                <br>                
            </ul>
    		</div>
    		<div class="homeitem3col">
    		<h3>SVN Commit Notification Mailing List</h3>
            <ul>
            	<br>
                <li>
                    For SVN commit notification join the <a href="https://dev.eclipse.org/mailman/listinfo/dsdp-mtj-commit">ddsdp-mtj-commit</a> mailing list
                </li>
                <br>
                <li>
                 	To access a web archive of this list, visit the 
					<a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-commit/">dsdp-mtj-commit Archives</a>.(<i>The current archive is only available to the list members.</i>)
    				<ul>
                        <li>
                        	<a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-commit/maillist.html">Index by date</a>  
                        </li>
                        <li>
                        <a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-commit/threads.html">Index by thread</a>  
                        </li>
                    </ul>
                </li>
                <br>
                <li>
                  You can subscribe to the list's RSS feed <a href="http://dev.eclipse.org/mhonarc/lists/dsdp-mtj-commit/maillist.rss">
                  <img src="http://www.eclipse.org/eclipse.org-common/themes/Phoenix/images/rss_btn.gif"></a>
                </li>
                <br>                
            </ul>
    		</div>
		</div> <!-- rightcolumn -->
	</div> <!-- maincontent -->
	
<script type="text/javascript">var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script><script type="text/javascript">try {var pageTracker = _gat._getTracker("UA-9293663-1");pageTracker._trackPageview();} catch(err) {}</script>
	
EOHTML;

	/* Generate the web page */
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
	?>