<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<!--
Copyright 1999-2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->


<!-- Content Stylesheet for Site -->

    ## Defined variables
    #set ($menutablebg = "#FFFFFF")
    #set ($menutablefg = "#000000")
    #set ($bodybg = "#ffffff")
    #set ($bodyfg = "#000000")
    #set ($bodylink = "#123465")
    #set ($pagebannerbg = "#669AE6")
    #set ($pagebannerfg = "#000000")
    #set ($bannerbg = "#EEEEEE")
    #set ($bannerfg = "#000000")
    #set ($subbannerbg = "#EFEFEF")
    #set ($subbannerfg = "#000000")
    #set ($tablethbg = "#039acc")
    #set ($tabletdbg = "#a0ddf0")
    #set ($colorhrline = "#999999")
    
<!-- start the processing -->
#document()
<!-- end the processing -->

## This is where the macro's live

#macro ( feature $feature)
	<h3>$feature.getAttribute("title").getValue()</h3>
	<table border="0">
		<tbody>
			<tr>
				<td style="text-align: center;" width="300">
					#foreach ( $items in $feature.getChildren() )
						#if ($items.getName().equals("image"))
							<p>
							<a class="fancybox-buttons" data-fancybox-group="button" href="$items.getAttribute("fullhref").getValue()">
								<img src="$items.getAttribute("href").getValue()" alt="" width="$items.getAttribute("width").getValue()" 
									height="$items.getAttribute("height").getValue()" />
							</a>
							<!--
							<img style="border: 1px solid black;"
									title="" src="$items.getAttribute("href").getValue()"
									alt="" width="$items.getAttribute("width").getValue()" 
									height="$items.getAttribute("height").getValue()" />
									</p>
									 -->
						#end
					#end
				</td>
				<td>
					#foreach ( $items in $feature.getChildren() )
						#if ($items.getName().equals("text"))
							$items
						#end
					#end
				</td>
			</tr>
	    </tbody>
	</table>
#end

#macro ( table $table)
<table>
    #foreach ( $items in $table.getChildren() )
        #if ($items.getName().equals("tr"))
            #tr ($items)
        #end
    #end
</table>
#end

#macro ( tr $tr)
<tr>
    #foreach ( $items in $tr.getChildren() )
        #if ($items.getName().equals("td"))
            #td ($items)
        #elseif ($items.getName().equals("th"))
            #th ($items)
        #end
    #end
</tr>
#end

#macro ( td $value)
#if ($value.getAttributeValue("colspan"))
#set ($colspan = $value.getAttributeValue("colspan"))
#end
#if ($value.getAttributeValue("rowspan"))
#set ($rowspan = $value.getAttributeValue("rowspan"))
#end
<td bgcolor="$tabletdbg" colspan="$!colspan" rowspan="$!rowspan" valign="top" align="left">
    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
        #if ($value.getText().length() != 0 || $value.hasChildren())
        $value.getContent()
        #else
        &nbsp;
        #end
    </font>
</td>
#end

#macro ( th $value)
#if ($value.getAttributeValue("colspan"))
#set ($colspan = $value.getAttributeValue("colspan"))
#end
#if ($value.getAttributeValue("rowspan"))
#set ($rowspan = $value.getAttributeValue("rowspan"))
#end
<th bgcolor="$tablethbg" colspan="$!colspan" rowspan="$!rowspan" valign="top" align="left">
    <font color="#000000" size="-1" face="arial,helvetica,sanserif">
        #if ($value.getText().length() != 0 || $value.hasChildren())
        $value.getContent()
        #else
        &nbsp;
        #end
    </font>
</th>
#end

#macro ( projectanchor $name $value )
#if ($value.startsWith("http://"))
    <a href="$value">$name</a>
#elseif ($value.startsWith("/site"))
    <a href="http://jakarta.apache.org$value">$name</a>
#else
    <a href="$relativePath$value">$name</a>
#end
#end

#macro ( metaauthor $author $email )
            <meta name="author" value="$author">
            <meta name="email" value="$email">
#end

#macro ( image $value )
#if ($value.getAttributeValue("width"))
#set ($width=$value.getAttributeValue("width"))
#end
#if ($value.getAttributeValue("height"))
#set ($height=$value.getAttributeValue("height"))
#end
#if ($value.getAttributeValue("align"))
#set ($align=$value.getAttributeValue("align"))
#end
<img src="$relativePath$value.getAttributeValue("src")" width="$!width" height="$!height" align="$!align">
#end

#macro ( source $value)
    <div align="left">
    <table cellspacing="4" cellpadding="0" border="0">
    <tr>
      <td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
      <td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
      <td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
    </tr>
    <tr>
      <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
      <td bgcolor="#ffffff"><pre>$escape.getText($value.getText())</pre></td>
      <td bgcolor="#023264" width="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
    </tr>
    <tr>
      <td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
      <td bgcolor="#023264" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
      <td bgcolor="#023264" width="1" height="1"><img src="/images/void.gif" width="1" height="1" vspace="0" hspace="0" border="0"/></td>
    </tr>
    </table>
    </div>
#end

#macro ( subsection $subsection)
    <table border="0" cellspacing="0" cellpadding="0" width="100%">
      <tr><td bgcolor="$subbannerbg">
        <font color="$subbannerfg" face="arial,helvetica,sanserif">
          <a name="$subsection.getAttributeValue("name")"><strong>$subsection.getAttributeValue("name")</strong></a>
        </font>
      </td></tr>
      <tr><td>
        <blockquote>
        #foreach ( $items in $subsection.getChildren() )
            #if ($items.getName().equals("img"))
                #image ($items)
            #elseif ($items.getName().equals("source"))
                #source ($items)
            #elseif ($items.getName().equals("table"))
                #table ($items)
            #else
                $items
            #end
        #end
        </blockquote>
      </td></tr>
      <tr><td><br/></td></tr>
    </table>
#end

#macro ( section $section)
    <table border="0" cellspacing="0" cellpadding="0" cellspacing="0" width="100%">
      <tr><td ><!-- bgcolor="$bannerbg" -->
        <font color="$bannerfg" face="verdana,arial,helvetica,sanserif">
          <a name="$section.getAttributeValue("name")"><strong>$section.getAttributeValue("name")</strong></a>
          <hr style="width:100%; color:$colorhrline; background-color:$colorhrline; height:1px; border:0px;"/>
        </font>
      </td></tr>
      <tr><td>
        <blockquote>
        #foreach ( $items in $section.getChildren() )
            #if ($items.getName().equals("img"))
                #image ($items)
            #elseif ($items.getName().equals("source"))
                #source ($items)
            #elseif ($items.getName().equals("table"))
                #table ($items)
            #elseif ($items.getName().equals("feature"))
                #feature ($items)
            #elseif ($items.getName().equals("subsection"))
                #subsection ($items)
            #else
                $items
            #end
        #end
        </blockquote>
        </p>
      </td></tr>
      <tr><td><br/></td></tr>
    </table>
#end

#macro ( makeProject )

    <!-- ============================================================ -->
    <div id="accordion" width="100%">
    
    #set ($menus = $project.getChild("body").getChildren("menu"))
    #foreach ( $menu in $menus )
    	<h3><a href="#$menu.getAttributeValue("name").replaceAll(" ","")">$menu.getAttributeValue("name")</a></h3>
    	<div  width="100%">
	        #foreach ( $item in $menu.getChildren() )
	            #set ($name = $item.getAttributeValue("name"))
	            #if ( $item.getAttributeValue("href").length() > 0 )
	            	#projectanchor($name $item.getAttributeValue("href"))<br/>
	        	#else
	            	<b>$name</b><br/>
	            		#foreach ( $subitem in $item.getChildren() )
	            			#set ($name = $subitem.getAttributeValue("name"))
	            			#projectanchor($name $subitem.getAttributeValue("href"))<br/>
	            		#end
	        	#end
	        #end
    	</div>
    #end
    
    </div>

	<!--
    #set ($menus = $project.getChild("body").getChildren("menu"))
    #foreach ( $menu in $menus )
    	<div class="ro"> 
		  <div class="lo">
		    <div class="ru"> 
		      <div class="lu"> 
		        <div class="inhalt"> 
    	
    		<font color="$menutablefg" face="arial,helvetica,sanserif" size="2pt" >
        	<b>$menu.getAttributeValue("name")</b>
        	</a>
        	<hr style="width:100%; color:$colorhrline; background-color:$colorhrline; height:1px; border:0px;"/>
		       <ul>
		        #foreach ( $item in $menu.getChildren() )
		            #set ($name = $item.getAttributeValue("name"))
		            #if ( $item.getAttributeValue("href").length() > 0 )
			            <font color="$menutablefg" face="arial,helvetica,sanserif" size="2pt">
			            	<li>#projectanchor($name $item.getAttributeValue("href"))</li>
			        	</font>
		        	#else
		            	<li><font color="$menutablefg" face="arial,helvetica,sanserif" size="2pt">$name</font>
		            		<ul>
		            		#foreach ( $subitem in $item.getChildren() )
		            			#set ($name = $subitem.getAttributeValue("name"))
		            			<li>#projectanchor($name $subitem.getAttributeValue("href"))</li>
		            		#end
		            		</ul>
		            	</li>
		        	#end
		        #end
		        </ul>
	        </div>
	      </div>
	    </div>
	  </div>
	</div>        
    #end
    
     -->
     
    <br/>
    <img src="images/apache-incubator-logo-no-borders.png" alt="apache-incubator-logo-no-borders.png" border="0"/>
    
#end

#macro (getProjectImage)
#if ($project.getChild("logo"))
#set ( $logoString = $project.getChild("logo").getAttributeValue("href") )
<td align="left">
#if ( $logoString.startsWith("/") )
<a href="$project.getAttributeValue("href")"><img src="$relativePath$logoString" alt="$project.getChild("logo").getText()" border="0"/></a>
#else
<a href="$project.getAttributeValue("href")"><img src="$relativePath/$logoString" alt="$project.getChild("logo").getText()" border="0"/></a>
#end
</td>
#end
#end

#macro (getBannerTitle)
#if ( $root.getChild("properties").getChild("bannertitle") )
    #set ( $pageBanner = $root.getChild("properties").getChild("bannertitle") )
#else
    #set ( $pageBanner = $root.getChild("properties").getChild("title").getText() )
#end
<td width="80%" align="right" valign="top" >
	<a href="http://demo.openmeetings.de" target="_BLANK">Demo</a>
	<span>|</span> 
	<a href="downloads.html" target="_PARENT">Download</a>
	<span>|</span> 
	<a href="installation.html" target="_PARENT">Installation</a>
	<span>|</span> 
	<a href="https://cwiki.apache.org/confluence/display/OPENMEETINGS" target="_BLANK">Wiki</a>
	<span>&nbsp;</span>
</td>
#end

#macro (printMeta $metaElement)
<meta #set ($attribs = $metaElement.getAttributes())
#foreach ($a in $attribs) $a.getName()="$a.getValue()" #end />
#end

#macro (document)
    <!-- ====================================================================== -->
    <!-- GENERATED FILE, DO NOT EDIT, EDIT THE XML FILE IN xdocs INSTEAD! -->
    <!-- Main Page Section -->
    <!-- ====================================================================== -->
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>

            #set ($authors = $root.getChild("properties").getChildren("author"))
            #foreach ( $au in $authors )
                #metaauthor ( $au.getText() $au.getAttributeValue("email") )
            #end

           #set ($metas = $root.getChildren("meta"))

            ##    Parse meta directives such as
            ##    <meta name="keyword" content="jakarta, java"/>
            #foreach ($meta in $metas) #printMeta($meta) #end

            ##    Support for <base> tags.
            #if ($root.getChild("properties").getChild("base"))
              #set ($url = $root.getChild("properties").getChild("base").getAttributeValue("href"))
              <base href="$url"/>
            #end

            <title>$project.getChild("title").getText() - $root.getChild("properties").getChild("title").getText()</title>
            <link rel="stylesheet" type="text/css" href="css/openmeetings.css">
            <link rel="stylesheet" type="text/css" href="css/jquery-ui.css">
            <link rel="stylesheet" type="text/css" href="css/coin-slider-styles.css">
            
            
			<!-- Add jQuery library -->
			<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
		
			<!-- Add mousewheel plugin (this is optional) -->
			<script type="text/javascript" src="js/jquery.mousewheel-3.0.6.pack.js"></script>
		
			<!-- Add fancyBox main JS and CSS files -->
			<script type="text/javascript" src="source/jquery.fancybox.js"></script>
			<link rel="stylesheet" type="text/css" href="source/jquery.fancybox.css" media="screen" />
			
			<!-- Add coinslider plugins -->
			<script type="text/javascript" src="js/coin-slider.min.js"></script>
		
			<!-- Add Button helper (this is optional) -->
			<link rel="stylesheet" type="text/css" href="source/helpers/jquery.fancybox-buttons.css?v=2.0.3" />
			<script type="text/javascript" src="source/helpers/jquery.fancybox-buttons.js?v=2.0.3"></script>
		
			<!-- Add Thumbnail helper (this is optional) -->
			<link rel="stylesheet" type="text/css" href="source/helpers/jquery.fancybox-thumbs.css?v=2.0.3" />
			<script type="text/javascript" src="source/helpers/jquery.fancybox-thumbs.js?v=2.0.3"></script>
			
			<script src="js/jquery.ui.core.js"></script>
			<script src="js/jquery.ui.widget.js"></script>
		
			<script src="js/jquery.ui.accordion.js"></script>
			
			<script>
			$(function() {
				$( "#accordion" ).accordion({
					autoHeight: false,
					navigation: true,
					navigationFilter: function () {
						var sidebarHrefArray = this.href.split("/");
    					var sideBarLastString = sidebarHrefArray[sidebarHrefArray.length - 1].toLowerCase();
						
						if (sideBarLastString.indexOf("#") == -1) {
							return false;
						}
						
						#set ($menus = $project.getChild("body").getChildren("menu"))
						/* document.location.href */
						var currentSection = "";
						
						var currentLocation = "";
						var currentLink = "";
						if (false) {
						
						}
    					#foreach ( $menu in $menus )
					        #foreach ( $item in $menu.getChildren() )
					            #set ($name = $item.getAttributeValue("name"))
					            #if ( $item.getAttributeValue("href").length() > 0 )
					            	
					            	else if (document.location.href.indexOf("$item.getAttributeValue("href")") > 0) {
					            		currentLocation = "$menu.getAttributeValue("name").replaceAll(" ","")";
					            		currentLink = "$item.getAttributeValue("href")".substr(1, "$item.getAttributeValue("href")".length);
					            	} 
					            	
					        	#else
				            		#foreach ( $subitem in $item.getChildren() )
				            			#set ($name = $subitem.getAttributeValue("name"))
				            			else if (document.location.href.indexOf("$subitem.getAttributeValue("href")") > 0) {
				            				currentLocation = "$menu.getAttributeValue("name").replaceAll(" ","")";
					            			currentLink = "$subitem.getAttributeValue("href")".substr(1, "$subitem.getAttributeValue("href")".length);
						            	} 
				            		#end
					        	#end
			        		#end
    					#end
    					
    					currentLink = currentLink.toLowerCase();
    					currentLocation = currentLocation.toLowerCase();
    					
						return sideBarLastString == currentLink+"#"+currentLocation;
					}
				});
			});
			</script>
			
			<script type="text/javascript">
				$(document).ready(function() {
					$('.fancybox-buttons').fancybox({
						openEffect  : 'none',
						closeEffect : 'none',
		
						prevEffect : 'none',
						nextEffect : 'none',
		
						closeBtn  : false,
		
						helpers : {
							title : {
								type : 'inside'
							},
							buttons	: {}
						},
		
						afterLoad : function() {
							this.title = 'Image ' + (this.index + 1) + ' of ' + this.group.length + (this.title ? ' - ' + this.title : '');
						}
					});	
					$('#accordion a').each(function() {
				      var a = $(this);
				      var href = a.attr("href");
				      if (href.indexOf("#") == -1) {
				      	  var compareIt = href.substr(2, href.length);
					      if (document.location.href.indexOf(compareIt)!= -1) {
					       a.addClass('active');
					      }
				      }
				    });
					$('#coin-slider').coinslider({ width: 640,height: 400, delay: 4000  });					
				});
			</script>	
						
			<style type="text/css">
				.fancybox-custom .fancybox-outer {
					box-shadow: 0 0 50px #222;
				}
			</style>
        </head>

        <body bgcolor="$bodybg" text="$bodyfg" link="$bodylink" vlink="$bodylink" alink="#000000">  
        	<div class="mainbody" with="100%">
        	<div class="superbody" width="100%">
            <table border="0" width="100%" cellspacing="0">
                <!-- TOP IMAGE -->
                <tr>
                    <td align='LEFT'>
                    #getProjectImage()
                    </td>
                    <td align='LEFT'>
                    #getBannerTitle()
                    </td>
                </tr>
            </table>
            <table border="0" width="100%" cellspacing="4">
                <tr><td colspan="2">
                    <hr noshade="" size="1"/>
                </td></tr>

                <tr>
                    <!-- LEFT SIDE NAVIGATION -->
                    <td width="20%" valign="top" nowrap="true">

                    <!-- special ACon Logo - leave here for next time
                    <a href="http://apachecon.com/2005/US/">
                        <img src="http://apache.org/images/ac2005us_blue_125x125.jpg" height="125"
                             width="125" border="0" alt="ApacheCon US 2005" />
                    </a>  -->

                   <!-- regular menu -->

                    #makeProject()
                    </td>
                    <td width="80%" align="left" valign="top">
                    #set ($allSections = $root.getChild("body").getChildren("section"))
                    #foreach ( $section in $allSections )
                        #section ($section)
                    #end
                    </td>
                </tr>

                <!-- FOOTER -->
                <tr><td colspan="2">
                    <hr noshade="" size="1"/>
                </td></tr>
                <tr><td colspan="2">
                    <div align="center"><font color="$bodylink" size="-1"><em>
                    Copyright &#169; 2003-2012, The Apache Software Foundation
                    </em></font></div>
                </td></tr>
            </table>
            </div>
            </div>
        </body>
    </html>
#end





