<!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>
						#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>
     
    <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">
            <link rel="stylesheet" type="text/css" href="css/colorbox.css" />
            
			<!-- Add jQuery library -->
			<script type="text/javascript" src="js/jquery-1.7.1.min.js"></script>
		
			<!-- Add coinslider plugins -->
			<script type="text/javascript" src="js/coin-slider.min.js"></script>
			
			<!-- Add colorbox plugin -->
			<script type="text/javascript" src="js/jquery.colorbox.js"></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').colorbox({rel:'fancybox-buttons',width:"75%", height:"75%"});
					$('#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





