<!--
 * 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>
	<head>
		<title>Apache Tuscany Websocket Sample</title>
		<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js" type="text/javascript"></script> 
		<script type="text/javascript" src="org.apache.tuscany.sca.WebsocketComponentContext.js"></script>
		<script type="text/javascript">
		var user = "";

		Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith.responseHandler = function(response) {
			var html = '<ul>';
			$.each(response, function(index, country) {
				html += '<li>' + country.name + "</li>"
			});
			html += '</ul>'
			$("#suggestions").html(html);
		}
		
		$(document).ready(function()
		{
			$("#country").keyup(function() {
				var text = $("#country").val();
				if (text != "") {
					Tuscany.WebsocketComponentContext.CountryServiceComponent.CountryService.getCountriesStartingWith(text);
				} else {
					$("#suggestions").html("");
				}
			});	
			$("#country").focus();
		});

		</script>
	</head>
	<body>
		<h2>Apache Tuscany Websocket Sample</h2>
		<h3>Real-time suggestions</h3>
		<table>
			<tr>
				<td>Enter a country name</td>
				<td><input type="text" id='country'/></td>
			</tr>
		</table>
		</div>
		<div id="suggestions">
		</div>
	</body>
</html>
