<!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.
-->

    <!-- ====================================================================== -->
    <!-- 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>

