<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements.  See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership.  The ASF licenses this file
  to you 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.
-->

    <!-- ====================================================================== -->
    <!-- GENERATED FILE, DO NOT EDIT, EDIT THE TEMPLATE INSTEAD! -->
    <!-- Main Page Section -->
    <!-- ====================================================================== -->
    
     <html>
        <head>
		<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
		<meta name="author" content="OpenMeetings Team">
		<meta name="email" content="sebawagner@apache.org">
		<title>OpenMeetings API Methods</title>
		<link rel="stylesheet" type="text/css" href="openmeetings_docs.css">
        </head>
	<body>
	
		<h3>Available WebServices:</h3>
	
		<iframe src="WebserviceIndex.html" width="100%" height="210" name="WebserviceIndex.html"
			scrolling="no" marginheight="0" marginwidth="0" frameborder="0">
		  <p>Your Browser does not support frames ...</p>
		</iframe>
		
		<hr />
	
	   <h3>WebService: $webServiceName</h3>
	   <p>$classComment<p>
	   <p>WSDL sample Url: <a href="http://localhost:5080/openmeetings/services/$webServiceName?wsdl">http://localhost:5080/openmeetings/services/$webServiceName?wsdl</a><p>
	
	<!-- Links to Methods -->
	   <h3>Index of Methods available in $webServiceName</h3>
	   
       <div class="navigation">
	   #foreach ( $method in $methods )
            #if ($method.isPublic()) 
                <div>
                <a href="#$method.name()"><b>$method.name()</b></a><br/>
                <div class="navigation_comment"><i >$method.commentText()</i></div>
                </div>
           #end
        #end
        </div>
	   
	    <h3>Methods Details in $webServiceName</h3>
	
		#foreach ( $method in $methods )
		    #if ($method.isPublic()) 
		      <div class="method">
		        <div class="method_header">
		        <div style="margin-left:10px">
    			<a name="$method.name()" ><b>$method.name()</b></a>
    			</div>
    			</div>
    			
    			Method: <i>$method.name() (
    			#set ($index = 0) 
    			#foreach ( $parameter in $method.parameters() )
    			   #if ($index > 0) 
    			     , 
    			   #end
    			   $parameter.type().simpleTypeName() $parameter.name()
    			   #set ($index = $index+1) 
    			#end
    			)
    			</i><br/>
    			<p>
    			  $method.commentText()
    			</p>
    			<p>
                  Return Type: $method.returnType()
                </p>
    			<p>Params:</p>
    			#if ( $method.paramTags().size() != $method.parameters().size() ) 
    				<b>Warning:</b><i> Params in this method do not seem to be correctly documentated</i>
    				<br/><br/>
    			#end
    			
    			#if ($method.paramTags().size() > 0) 
	    			<table rules="all" border="1">
	    			   <thead>
	    			   <tr>
	    			     <th width="200" align="left">Type</th>
	    			     <th width="200" align="left">Fieldname</th>
	    			     <th width="400" align="left">Description</th>
	    			   </tr>
	    			   </thead>
	    			   <tbody>
	    			   #set ($index = 0) 
	    			   #foreach ( $parameter in $method.paramTags() )
	    			   <tr>
	                     <td valign="top">
	                     	#if ($method.parameters().size() <= $index) 
	                     		$index Doclet Param Mismatch: fix JavaDocs in this Method!
	                     	#else
	                     		$method.parameters().get($index).type().simpleTypeName()
	                     	#end 
	                     </td>
	                     <td valign="top">$parameter.parameterName()</td>
	                     <td valign="top">$parameter.parameterComment()</td>
	                   </tr>
	                   
	                   #set ($index = $index+1) 
	                   #end
	                   </tbody>
	    			</table>
    			#else
    				<i>No Params</i>
    			#end
    			<br/>
    			REST Sample Call/URL:<br/>
    			#set ($link = "http://localhost:5080/openmeetings/services/"+$webServiceName+"/"+$method.name()) 
    			#set ($displayLink = $link)
    			#set ($index = 0)
    			#foreach ( $parameter in $method.parameters() )
    				#if ($index == 0)
    					#set ($link = $link+"?")
    					#set ($displayLink = $link)
    				#else
    					#set ($link = $link+"&") 
    					#set ($displayLink = $displayLink + "&amp;")
    				#end
    				#set ($link = $link + $parameter.name()+"=VALUE") 
    				#set ($displayLink = $displayLink + $parameter.name()+"=VALUE") 
    				#set ($index = $index+1)
				#end
				<a href="$link">$displayLink</a>
    		  </div>
    	   #end
		#end
	
	
	</body>
</html>

