<!--
 * 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.    
-->
<html>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">

function corsGet() {
    jQuery.get('http://localhost:8080/HelloworldComponent/Helloworld/sayHello?name=world', null, function(data){alert(data);}, null);
}

</script>

<body>
<h1>Apache Tuscany Helloworld JAX-RS Sample</h1>

<p>This page uses the Tuscany 'Cross-Origin Resource Sharing' (CORS) support to enable calling the Helloworld JAX-RS service with JQuery<br/><br/>

<a href="#" onclick="corsGet(); return false;">Invoke the Helloworld service</a>

</p><p>
Clicking the above link should result in a pop-up alert box saying "Hello World".
</p>

</body>
</html>