<!--
 * 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.    
 -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <title>Tuscany JQuery Client HelloWorld Sample</TITLE>
    
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script language="JavaScript">

       function getGreeting() {
          var name = document.getElementById("name").value;
          $.getJSON('http://localhost:8081/HelloWorldService/sayHello?name=' + name + '&callback=?', handleResponse);
       }
       function handleResponse(data) {
          document.getElementById('greeting').innerHTML=data;
       }
  
    </script>
    
  </head>

  <body>
    <h2>Tuscany JSONP HelloWorld Sample</h2>

    This example uses the JQuery getJSON to make JSONP requests to the SCA service 'HelloWorldService'

    <p>Enter Name: &nbsp;&nbsp;&nbsp;
    <input type="text" id="name" size="30"/>               
    <input type="button" value="Submit" onclick="getGreeting()" />

    </p><div id='greeting'></div>

  </body>
</html>
