<?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("../_projectCommon.php");    # All on the same line to unclutter the user's desktop'

$pageTitle 		= "Ecosystem Website Promotion";
$pageKeywords	= "";
$pageAuthor		= "";

ob_start();
?>
<style type="text/css">
h2 {
border-bottom: solid
}
h3 {
border-bottom: thin dotted
}
</style>

    <div id="maincontent">
	<div id="midcolumn">
        <h1><big>Eclipse.org Website Promotion Program</big></h1>
          
        <h2><b><big>Goals of this Program</big></b></h2>
        <p>This program has two main goals:</p>
        
        <ol>
           <li>Provide value to Strategic Membership in the Eclipse Foundation.</li>
           <li>Provide valuable additional information about our ecosystem to users of Eclipse.org.</li>
        </ol>

        <p>This program is made possible by the success of a year&#150;long study running Google ads on 
        <a href="http://www.eclipseplugincentral.com/">Eclipse Plugin Central</a>.  The
        data showed that promotions could be tastefully placed on Eclipse Foundation properties to the benefit of both our
        ecosystem and website visitors looking for more information.</p>
        
        <h2><b><big>How Do I Participate?</big></b></h2>
        <p>There are two kinds of promotions that will randomly appear on Eclipse.org - those specific to Strategic Members and content provided by 
        the <a href="https://adwords.google.com/">Google Adwords</a> service.</p>
        
        <h3>Strategic Member Promotion</h3>
        <p>Strategic Members will automatically have their logo placed in rotation as a "Featured Member" of the Eclipse Foundation.
        Strategic Members are also able and encouraged to place campaign ads into their rotation (see <a href="#FAQ">FAQ</a> below for details).  Extra impressions
        cannot be purchased at this time and this program is currently only available to Strategic Members.
		</p>

		<h3>Other Promotion</h3>		
		<p>Other members and non&#150;members alike are able to place content on Eclipse.org through 
		the	<a href="http://adwords.google.com/">Google Adwords</a> service.  To target Eclipse.org with
		your ads, please see the Google ads FAQ for <a href="http://adwords.google.com/support/bin/answer.py?hl=en&answer=18265">Site Targeted Ads</a>.
		Please refer to the <a href="http://adwords.google.com/">Google Adwords</a> service for help setting up and running your
		Google promotions.  There is nothing you need to do with the Eclipse Foundation to run content and we are unable to help 
		you place your Google content - work with Google on any questions you may have including 
		<a href="http://adwords.google.com/support/bin/answer.py?hl=en&answer=6105">why your promotions are not appearing</a>.</p>
  
        <h2><big><b><a name="FAQ"></a>FAQ</a></b></big></h2>
         
		<b>As a Strategic Member, what kind of custom campaigns can I run?</b>
        <p>Here are the specifications for allowable content:
         <ul>
         	<li>Not more than 200px wide or 200px high.</li>
         	<li>Content must be GIF (preferred) or JPG format (NO Flash/SWF at this time).</li>
         	<li>Content must be less than 20k.  Content as large as 40k will be accepted but will be given proportionately fewer rotations.</li>
         	<li>It must be clear which organization the promotion is from.  For example, your company logo and/or an obvious company brand must
         	be clearly on the promotion.</li>
         	<li>Content must fit with the look and feel of Eclipse.org.  You do <b>not</b> have to match the eclipse.org
         	color palette, but dark colors, white backgrounds, blacks, blues and purples will integrate best.  Content that 
         	is obviously flashy (i.e., flashing red backgrounds) will not be permitted.</li>
         	<li>If you would like to match the Eclipse.org color palette, here are some color codes to help: 
         	<br><img align="center" src="./promotion_program/palette.gif"></li>
        </p>

       <br><b>As an ecocystem participant, what kind of content can I run?</b>
        <p>Standard Text and List Content will be served by <a href="http://adwords.google.com/">Google Adwords</a>.
        </p>

        <br><b>How often will my content appear?</b>
        <p>
        The Eclipse.org home page is hit tens of thousands of times per day.  We will experiment to find an appropriate balance
        of Strategic Member content and content hosted by Google Adwords throughout 2008.  Strategic member ads will appear
        relative to each other on basis weighted to relative membership dues.
        </p>

         <br><b>Show me some examples!</b>
        <p>
        Here is where the content will appear on Eclipse.org: 
    	<br><img align="center" src="./promotion_program/screen2.gif">
    	</p>
	
        <p>
        Here is an example of promoting our Strategic Members:
		<br><img align="center" src="./promotion_program/screen4.gif">
        </p>
        
        <p>
        Here is an example of Google content on Eclipse.org:
        <br><img align="center" src="./promotion_program/screen3.gif">
		</p>
		
        <p>
        Here is an example of a Strategic Member campaign:
        <br><img align="center" src="./promotion_program/screen1.gif">
	      </p>

	      
       <br><b>I am a strategic Member, where do I send my 200x200 promotion?</b>
       <p>Please contact membership at eclipse dot org.</p>
 	      
       <br><b>I need more information.</b>
       <p>Please contact membership at eclipse dot org.</p>
 
		
  </div></div>
<?php
	$html = ob_get_contents();
	ob_end_clean();

	# Generate the web page
	$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>
