blob: 47938c8f1b0b59b2ce7171c7709a7a6ebff53cc0 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>PhoneBook</title>
<script type="text/javascript" src="PhoneBook.ashx?proxy&v=2"></script>
<script type="text/javascript" src="js/dojo/dojo.js"></script>
<script type="text/javascript">
dojo.require("dojo.widget.TabContainer");
dojo.require("dojo.widget.ContentPane");
dojo.require("dojo.widget.LayoutContainer");
dojo.require("dojo.io.*");
dojo.require("dojo.event.*");
dojo.require("dojo.html.*");
dojo.require("dojo.json");
dojo.require("dojo.widget.FilteringTable");
dojo.hostenv.writeIncludes();
/* call server */
function server(call)
{
var bindArgs = {
url: call.url+'?rpc',
error: function(type, data, evt){alert("Error Communicating with Server: " + data.result);},
method: "POST",
mimetype: "text/json",
handle: call.callback,
postContent: dojo.json.serialize(call.request)
};
var req = dojo.io.bind(bindArgs);
dojo.event
return req;
}
var container_id = "container";
function view_select(id) {
var w = dojo.widget.byId(container_id);
w.selectChild(id);
}
/* lister */
var lister_id = "lister";
var entry_list_id = "entry_list";
function lister_select() {
view_select(lister_id);
}
function entry_list() {
return dojo.widget.byId(entry_list_id);
}
function entry_list_result(type, data, evt)
{
entry_list().store.setData(data.result);
}
function entry_list_load()
{
PhoneBook.rpc.entry_list(entry_list_result).call(server);
}
dojo.addOnLoad(entry_list_load);
function entry_list_select_edit(evt) {
entry_edit(entry_list().getSelectedData().entry_key);
}
function entry_list_select_delete(evt) {
entry_delete(entry_list().getSelectedData().entry_key);
}
function entry_list_select() {
dojo.event.connect(entry_list(), "onSelect", entry_list_select_edit);
}
dojo.addOnLoad(entry_list_select);
/* lister filters */
function dateFilter(hired) {
return (hired == '5/29/1987' || hired == '11/18/1984');
}
function applyDate(id){
dojo.widget.byId(id).setFilter("hired", dateFilter);
}
function nameFilter(last_name){
return (last_name.charAt(0) >= 'M' && last_name.charAt(0) <= 'Z');
}
function applyName(id){
dojo.widget.byId(id).setFilter("last_name", nameFilter);
}
function clearFilters(id){
dojo.widget.byId(id).clearFilters();
}
function reloadData(id){
dojo.widget.byId(id).store.clearData();
entry_list_load();
}
/* editor */
var editor_id = "editor";
function editor_select() {
view_select(editor_id);
}
var entry_form_id = "entry_form";
function entry_form() {
return dojo.widget.byId(entry_form_id);
}
var dpHired_id = "dpHired";
function setHired(hired) {
var dpHired = dojo.widget.byId(dpHired_id);
dpHired.setDate(hired);
}
function entry_edit_result(type, data, evt)
{
entry_form().setValues(data.result);
var part = new Array();
part = data.result.hired.split('/',3); // mm/dd/yyyy
var yyyy = part[2];
var mm = part[0];
var dd = part[1];
if (mm.length==1) mm = new String().concat('0',mm);
if (dd.length==1) dd = new String().concat('0',dd);
var hired = new String().concat( yyyy,'-',mm,'-',dd );
setHired(hired);
editor_select();
}
function entry_edit(entry_key)
{
PhoneBook.rpc.entry(entry_key,entry_edit_result).call(server);
}
function entry_save_result() {
reloadData(entry_list_id);
entry_reset();
lister_select();
}
function entry_save_update_result(type, data, evt)
{
alert ( "Edited: " + data.result.user_name + " (" + data.result.entry_key + ")" );
entry_save_result();
}
function entry_save_insert_result(type, data, evt)
{
alert ( "Added: " + data.result.user_name + " (" + data.result.entry_key + ")" );
entry_save_result();
}
function entry_save()
{
var values = entry_form().getValues();
if (values.entry_key)
PhoneBook.rpc.entry_save(values,entry_save_update_result).call(server);
else
PhoneBook.rpc.entry_save(values,entry_save_insert_result).call(server);
}
function entry_quit() {
entry_reset();
lister_select();
}
function entry_reset() {
var values = entry_form().getValues();
values.first_name = "";
values.last_name = "";
values.extension = "";
values.user_name = "";
values.hours = "37.5";
values.entry_key = "";
entry_form().setValues(values);
var today = new Date();
setHired(today);
}
function entry_add()
{
entry_reset();
editor_select();
}
function entry_delete_result(type, data, evt)
{
alert ( "Deleted: (" + data.result.entry_key + ")" );
entry_save_result();
}
function entry_delete(entry_key)
{
if (entry_key) {
var ok = confirm ( "Delete entry?" );
if (ok)
PhoneBook.rpc.entry_delete(entry_key,entry_delete_result).call(server);
}
}
</script>
<style type="text/css">
body {
font-family : sans-serif;
}
.dojoTabPaneWrapper {
padding : 10px 10px 10px 10px;
}
</style>
<style type="text/css">
/***
The following is just an example of how to use the table.
You can override any class names to be used if you wish.
***/
table {
font-family:Lucida Grande, Verdana;
font-size:0.8em;
width:100%;
border:1px solid #ccc;
border-collapse:collapse;
cursor:default;
}
table td,
table th{
padding:2px;
font-weight:normal;
}
table thead td, table thead th {
background-image:url(images/ft-head.gif);
background-repeat:no-repeat;
background-position:top right;
}
table thead td.selectedUp, table thead th.selectedUp {
background-image:url(images/ft-headup.gif);
}
table thead td.selectedDown, table thead th.selectedDown {
background-image:url(images/ft-headdown.gif);
}
table tbody tr td{
border-bottom:1px solid #ddd;
}
table tbody tr.alt td{
background: #e3edfa;
}
table tbody tr.selected td{
background: yellow;
}
table tbody tr:hover td{
background: #a6c2e7;
}
table tbody tr.selected:hover td{
background:#ff9;
}
#inputArea{
margin:1em 0;
padding:1em;
background-color:#eef;
}
#updateTestInput{
border:1px solid #ccc;
width:100%;
height:80px;
font-family:serif;
font-size:0.9em;
overflow:auto;
}
</style>
</head>
<body>
<div id="container" dojoType="TabContainer" style="width:100%; height:70%;" selectedChild="lister">
<div id="lister" dojoType="ContentPane" label="PhoneBook Directory" >
<table id="filter_menu"><tr><td>
<input type="button" onclick="applyDate('entry_list');" value="Show only hires between 1/1/1984 and 1/1/1987" />
<input type="button" onclick="applyName('entry_list');" value="Show only names between M and Z" />
<input type="button" value="Show All Entries" onclick="clearFilters('entry_list');" />
<input type="button" value="Reload Entries" onclick="reloadData('entry_list');" />
</td></tr></table>
<table id="entry_list"
dojoType="filteringTable" alternateRows="true" valueField="user_name" >
<thead>
<tr>
<th field="last_name" sort="asc">Last Name</th>
<th field="first_name">First Name</th>
<th field="extension">Extension</th>
<th field="user_name">User</th>
<th field="hired" align="center">Hired</th>
<th field="hours" align="center">Hours</th>
</tr>
</thead>
</table>
<table id="edit_menu"><tr><td>
<input type="button" value="Add Entry" onclick="entry_add('entry_list');" />
</td></tr></table>
</div>
<div id="editor" dojoType="ContentPane" label="Entry Editor">
<form id="entry_form" dojoType="Form">
<table><tr>
<td>First Name</td><td><input name="first_name" /></td>
</tr><tr>
<td>Last Name</td><td><input name="last_name" /></td>
</tr><tr>
<td>Extension</td><td><input name="extension" /></td>
</tr><tr>
<td>User Name</td><td><input name="user_name" /></td>
</tr><tr>
<td>Hired</td><td><input name="hired" widgetid="dpHired" dojoType="dropdowndatepicker" displayFormat="MM/dd/yyyy" /></td>
</tr><tr>
<td>Hours</td><td><input name="hours" /></td>
</tr><tr>
<td rowspan="2">
<input type="button" value="SAVE" onClick="entry_save();" />
<input type="button" value="CANCEL" onClick="entry_quit();" />
<input type="button" value="DELETE" onclick="entry_list_select_delete('entry_list');" />
<input type="hidden" name="editor" value="1" />
<input type="hidden" name="entry_key" />
</td>
</tr></table>
</form>
</div>
</div>
</body>
</html>