<?xml version="1.0" encoding="UTF-8"?>
<!--
  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 xmlns:wicket="http://wicket.apache.org">
	<wicket:panel>
		<div class="formSaveBar">
			<div class="formSaveButton">
				<input type="submit" value="" wicket:id="ajax-save-button" wicket:ommessage="title:144" />
			</div>
			<div class="formNewButton">
				<input type="submit" value="" wicket:id="ajax-new-button" wicket:ommessage="title:155" />
			</div>
			<div class="formRefreshButton">
				<input type="submit" value="" wicket:id="ajax-refresh-button" wicket:ommessage="title:156" />
			</div>
			<div class="formCancelButton">
				<input type="submit" value="" wicket:id="ajax-cancel-button" wicket:ommessage="title:157" />
			</div>
			<span wicket:id="newRecord"></span>
		</div>
		<div wicket:id="feedback" class="adminFormsFeedbackPanel">[[ feedback ]]</div>
		<wicket:child />
	</wicket:panel>
</html>
