[ List Archives Home ] [ Thread index for 2008 ]
[ Date index for 2008 ]
[ Author index for 2008 ]
[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
- Date: Fri, 15 Sep 2006 17:48:15 +0200
- From: Martin Lindén <martin at lib dot kth dot se>
- Subject: RE: [IUG] Patron Online Registration Question
Hi,
Patron online registration is working at our site. To prevent users
accidentally pressing Enter without data in the fields I've used a script I
found on the Web
http://javascript.internet.com/buttons/click-to-submit.html
the script to be inserted in the Head section of the page:
<SCRIPT LANGUAGE="JavaScript">
<!-- Original: Shawn Hafen (shafen at mail dot com) -->
<!-- Web Site:
http://shafen0.tripod.com/index.html -->
<!-- This script and many more are available free online at -->
<!-- The JavaScript Source!!
http://javascript.internet.com -->
<!-- Begin
function onKeyPress () {
var keycode;
if (window.event) keycode = window.event.keyCode;
else if (e) keycode = e.which;
else return true;
if (keycode == 13) {
return false
}
return true
}
document.onkeypress = onKeyPress;
// End -->
</script>
Followed by a normal <input type=submit> in the Body section.
I do not believe there is a problem using the hardcoded versions of the
Tokens.
We created our pages in version 2005 not using any Tokens and have recently
upgraded to version 2006 without problems.
One field that can create problems is the field Unique code u ,in Sweden
used for Personnummer in the States maybe the social security #, as the
registration page matches on that field when transmitted. So if you test
with the same patron record several times the result will be a blank, empty
form. Innovative has as yet not come up with an error message or similar to
this situation.
We force the patrons to fill in certain fields and the codes can be seen on
our live pages at
http://innopac.lib.kth.se/screens/selfcard.html and the
pages following that page.
The Online registration has made our work easier at the circulation desks.
There is still some work needed, checking addresses, credentials etc left.
Regards,
Martin Lindén
Systems Librarian
KTHB
Osquars backe 31
100 44 Stockholm
070 641 39 64
-----Original Message-----
From: innopac-bounces at innopacusers dot org
[
mailto:innopac-bounces at innopacusers dot org] On Behalf Of Valentina Mayz
Sent: Friday, September 15, 2006 3:23 PM
To: 'IUG INNOPAC List'; awelch at ci dot aurora dot co dot us
Subject: Re: [IUG] Patron Online Registration Question
Hi everyone,
We are implementing patron Self Registration and I need a little help.
There isn't much in the archive on this topic and the thread below was the
most relevant I could find. Hopefully more people have SelfReg by now that
might have more input to the topic.
Page #105699 in the manual states:
"Web OPAC does not validate information entered on this form except to
confirm that the email address contains a '@' character. Your organization
can include validation JavaScripts, as needed. Innovative Interfaces does
not provide assistance with writing JavaScript."
That's lovely. without form validation you can submit
empty/incomplete/incorrect forms all you want, creating records in your
database ad nauseum, so I guess we will have more work than expected by
either writing our own JavaScript or by cleaning up patron records derived
from bad form submissions.
Andrew's response and generous provision of code below is helpful, but I
gather from it that to be able to make fields required or check for accurate
zip codes, phone numbers, etc., you would have to hard-code the entire form
- that is, NOT use III's tokens.
Is this the case? We absolutely need form validation, so if the only way to
have it is to have to hard-code everything without the use of system tokens,
then how does this affect the product's efficacy? Does it bring more
problems when you upgrade software? (We're on Rel. 2005).
I want to go off on a rant about this annoyance, but I'll spare you :->
Thanks in advance,
. . . . . . . . . . . . . . . . . . . . . . . . . .
V A L E N T I N A M A Y Z
L i b r a r y W e b A d m i n i s t r a t o r
A l v i n S h e r m a n L i b r a r y
N o v a S o u t h e a s t e r n U n i v e r s i t y
9 5 4 - 2 6 2 - 4 6 0 5
============================================
Date: Tue, 14 Mar 2006 12:21:45 -0700
From: "Andrew Welch" <awelch at ci dot aurora dot co dot us>
Subject: Re: [IUG] Patron Online Registration Question
This would require a bit of javascript, but I'm not sure how every
browser would react. The following would work in most cases:
<script type="text/javascript">
function noenter() {
return !(window.event && window.event.keyCode == 13); }
</script>
Within each <input> tag, add the following attribute:
onkeypress="return noenter()"
I've created form validation for our self registration page, but it is a
little unwieldy and took quite of bit of tweaking to get right. By using
this, I don't need a "noenter" function like the one above, because if
the user hits the enter key before all of the information has been
filled in, the form prompts the user to complete the form and does not
submit. Here's the code for our page (which, I should add, is not live
yet), minus the <html> tags:
<head>
<title>Get a Library Card - Aurora Public Library, Aurora CO</title>
<meta http-equiv="Content-Type" content="text/html" />
<link rel="stylesheet" href="/screens/styles.css" type="TEXT/CSS" />
<link rel="stylesheet" href="/screens/search_tabs.css" type="text/css"
/>
<style type="text/css">
<!--
.error {
font-weight: bold;
background-color: transparent;
color: #cc0000;
}
-->
</style>
<script language="JavaScript" type="text/javascript">
<!--
//
----------------------------------------------------------------------
// Javascript form validation routines.
// Author: Stephen Poley
//
// Simple routines to quickly pick up obvious typos.
// All validation routines return true if executed by an older browser:
// in this case validation must be left to the server.
//
----------------------------------------------------------------------
var nbsp = 160; // non-breaking space char
var node_text = 3; // DOM text node-type
var emptyString = /^\s*$/
var glb_vfld; // retain vfld for timer thread
// -----------------------------------------
// trim
// Trim leading/trailing whitespace off string
// -----------------------------------------
function trim(str)
{
return str.replace(/^\s+|\s+$/g, '')
};
// -----------------------------------------
// setfocus
// Delayed focus setting to get around IE bug
// -----------------------------------------
function setFocusDelayed()
{
glb_vfld.focus()
}
function setfocus(vfld)
{
// save vfld in global variable so value retained when routine exits
glb_vfld = vfld;
setTimeout( 'setFocusDelayed()', 100 );
}
// -----------------------------------------
// msg
// Display warn/error message in HTML element
// commonCheck routine must have previously been called
// -----------------------------------------
function msg(fld, // id of element to display message in
msgtype, // class to give element ("warn" or "error")
message) // string to display
{
// setting an empty string can give problems if later set to a
// non-empty string, so ensure a space present. (For Mozilla and Opera
one could
// simply use a space, but IE demands something more, like a
non-breaking space.)
var dispmessage;
if (emptyString.test(message))
dispmessage = String.fromCharCode(nbsp);
else
dispmessage = message;
var elem = document.getElementById(fld);
elem.firstChild.nodeValue = dispmessage;
elem.className = msgtype; // set the CSS class to adjust appearance
of message
};
// -----------------------------------------
// commonCheck
// Common code for all validation routines to:
// (a) check for older / less-equipped browsers
// (b) check if empty fields are required
// Returns true (validation passed),
// false (validation failed) or
// proceed (don't know yet)
// -----------------------------------------
var proceed = 2;
function commonCheck (vfld, // element to be validated
ifld, // id of element to receive info/error
msg
reqd) // true if required
{
if (!document.getElementById)
return true; // not available on this browser - leave validation to
the server
var elem = document.getElementById(ifld);
if (!elem.firstChild)
return true; // not available on this browser
if (elem.firstChild.nodeType != node_text)
return true; // ifld is wrong type of node
if (emptyString.test(vfld.value)) {
if (reqd) {
msg (ifld, "error", "This field is required.");
setfocus(vfld);
return false;
}
else {
msg (ifld, "warn", ""); // OK
return true;
}
}
return proceed;
};
// -----------------------------------------
// validatePresent
// Validate if something has been entered
// Returns true if so
// -----------------------------------------
function validatePresent(vfld, // element to be validated
ifld ) // id of element to receive info/error
msg
{
var stat = commonCheck (vfld, ifld, true);
if (stat != proceed) return stat;
msg (ifld, "warn", "");
return true;
};
// -----------------------------------------
// validateTelnr
// Validate telephone number
// Returns true if so (and also if could not be executed because of old
browser)
// Requires a format of xxx-xxx-xxxx
// -----------------------------------------
function validateTelnr (vfld, // element to be validated
ifld, // id of element to receive info/error
msg
reqd) // true if required
{
var stat = commonCheck (vfld, ifld, reqd);
if (stat != proceed) return stat;
var tfld = trim(vfld.value); // value of field with whitespace
trimmed off
var telnr = /\d{3}\-\d{3}\-\d{4}/
if (!telnr.test(tfld)) {
msg (ifld, "error", "This is not a valid telephone number. Please
use the format xxx-xxx-xxxx.");
setfocus(vfld);
return false;
}
var numdigits = 0;
for (var j=0; j<tfld.length; j++)
if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;
if (numdigits<6) {
msg (ifld, "error", "ERROR: " + numdigits + " digits - too short");
setfocus(vfld);
return false;
}
if (numdigits>14)
msg (ifld, "warn", numdigits + " digits - check if correct");
else {
if (numdigits<10)
msg (ifld, "warn", "Only " + numdigits + " digits - check if
correct");
else
msg (ifld, "warn", "");
}
return true;
};
// -----------------------------------------
// validateBday
// Validate birthdate
// Returns true if so (and also if could not be executed because of old
browser)
// Requires a format of mmddyyyy
// -----------------------------------------
function validateBday (vfld, // element to be validated
ifld, // id of element to receive info/error
msg
reqd) // true if required
{
var stat = commonCheck (vfld, ifld, reqd);
if (stat != proceed) return stat;
var tfld = trim(vfld.value); // value of field with whitespace
trimmed off
var bday = /[0-1][0-9][0-3][0-9][1-2][0,9][0-9][0-9]/
if (!bday.test(tfld)) {
msg (ifld, "error", "This is not a valid birthdate. Please fill in
all fields.");
setfocus(vfld);
return false;
}
var numdigits = 0;
for (var j=0; j<tfld.length; j++)
if (tfld.charAt(j)>='0' && tfld.charAt(j)<='9') numdigits++;
if (numdigits<6) {
msg (ifld, "error", "ERROR: " + numdigits + " digits - too short");
setfocus(vfld);
return false;
}
if (numdigits>14)
msg (ifld, "warn", numdigits + " digits - check if correct");
else {
if (numdigits<8)
msg (ifld, "warn", "Only " + numdigits + " digits - check if
correct");
else
msg (ifld, "warn", "");
}
return true;
};
// -----------------------------------------
// swapBday
// Convert dropdown menu values into a numeric string;
// Transfer that string to "F051birthdate" input for validation and
submission.
// -----------------------------------------
function swapBday() {
var doc = document.selfRegForm;
var moSel = doc.ddMonth[doc.ddMonth.selectedIndex].value;
var dySel = doc.ddDay[doc.ddDay.selectedIndex].value;
var yrSel = doc.ddYear[doc.ddYear.selectedIndex].value;
var bdayString = moSel + dySel + yrSel;
document.selfRegForm.F051birthdate.value = bdayString;
};
// -----------------------------------------
// validateEmail
// Validate e-mail address
// Returns true if so (and also if could not be executed because of old
browser)
// -----------------------------------------
function validateEmail (vfld, // element to be validated
ifld, // id of element to receive info/error
msg
reqd) // true if required
{
var stat = commonCheck (vfld, ifld, reqd);
if (stat != proceed) return stat;
var tfld = trim(vfld.value); // value of field with whitespace
trimmed off
var email = /^[^ at ]+ at [^ at dot ]+\ dot [^ at ]*\w\w$/
if (!email.test(tfld)) {
msg (ifld, "error", "This is not a valid e-mail address.");
setfocus(vfld);
return false;
}
var email2 = /^[A-Za-z][\w dot -]+ at \w[\w dot -]+\ dot [\w dot
-]*[A-Za-z][A-Za-z]$/
if (!email2.test(tfld))
msg (ifld, "warn", "Unusual e-mail address - please verify.");
else
msg (ifld, "warn", "");
return true;
};
//-->
</script>
</head>
<body onLoad="document.forms[0].elements[0].focus();">
<!--{toplogo}-->
<div id="searchTabContainer">
<ul id="searchTabList">
<li><a href="/search" title="Keyword Search">Keyword</a></li>
<li><a href="/search/t" title="Title Search">Title</a></li>
<li><a href="/search/a" title="Author Search">Author</a></li>
<li><a href="/search/d" title="Subject Search">Subject</a></li>
<li><a href="/screens/srchhelp_number.html" title="Number
Search">Number</a></li>
<li><a href="/search/q" title="Author/Title
Search">Author/Title</a></li>
<li><a href="/patroninfo" title="Manage Your Account"
id="current">Manage Account</a></li>
<li><a href="/acquire" title="Suggest a Purchase">Suggest
Purchase</a></li>
<li><a href="
http://prospector.coalliance.org/"; title="Search the
Prospector system of libraries">Prospector</a></li>
</ul>
</div>
<!--End navigation menu-->
<!--Begin main body-->
<div id="searchBody" style="text-align:left;">
<table style="width:100%;">
<tr>
<td style="font-size:1.1em; font-weight:bold; border-bottom:1px solid
#0132a7;">Get a Library Card</td>
</tr>
</table>
<br />
<!--Beginning main page content-->
<script type="text/javascript">
// Only script specific to this form goes here.
// General-purpose routines are in a separate file.
function validateOnSubmit() {
var elem;
var errs=0;
// execute all element validations in reverse order, so focus gets
// set to the first one in error.
if (!validateEmail (document.forms.selfRegForm.zemailaddr,
'msg_email', true)) errs += 1;
if (!validateBday (document.forms.selfRegForm.F051birthdate,
'msg_bday', true)) errs += 1;
if (!validateTelnr (document.forms.selfRegForm.tphone1,
'msg_tphone1', true)) errs += 1;
if (!validatePresent(document.forms.selfRegForm.full_aaddress2,
'msg_address2', true)) errs += 1;
if (!validatePresent(document.forms.selfRegForm.full_aaddress,
'msg_address', true)) errs += 1;
if (!validatePresent(document.forms.selfRegForm.nlast, 'msg_lname',
true)) errs += 1;
if (!validatePresent(document.forms.selfRegForm.nfirst,
'msg_fname', true)) errs += 1;
if (errs>1) alert('There are fields that need correction before
your registration is successful.');
if (errs==1) alert('There is a field that needs correction before
your registration is successful.');
return (errs==0);
};
</script>
<form method="post" name="selfRegForm" id="selfRegForm" onsubmit="return
validateOnSubmit()" style="margin-top:0px; margin-bottom:0px;">
<div class="selfRegWelcome" style="font-size:.8em;
margin-bottom:10px;">Welcome!
<br />
This form allows you to register online as a patron of our library. Your
privileges will be limited to accessing our online databases and
requesting item holds; these privileges will expire after 14 days. All
fields below are required.
</div>
<!--{iferrmsg}-->
<div style="font-weight:bold; color:#cc0000;">
Registration could not be completed. Please call 303-739-6628 for
assistance.
</div>
<!--{xif}-->
<!--
The hidden template name below overrides the selfreg_template EO; if
certain users need a special template, set this input accordingly when
you create the version of selfreg.html for those users.
-->
<!--
<input type="hidden" name="TemplateName" value="YOUR VALUE">
<br />
-->
<table style="width:100%; border:none; font-size:.8em;">
<tr>
<td style="font-weight:bold; width:160px;">First Name<br />
<input name="nfirst" id="nfirst" type="text" alt="First Name" value=""
size="20" maxlength="40" onfocus="this.select()"
onChange="javascript:this.value=this.value.toUpperCase();
validatePresent(this, 'msg_fname', true);">
</td>
<td style="font-weight:bold; width:58px;">M.I.<br />
<input name="nmiddle" id="nmiddle" type="text" alt="M.I. (Middle
Initial)" value="" size="3" maxlength="4" onfocus="this.select()"
onChange="javascript:this.value=this.value.toUpperCase();">
</td>
<td style="font-weight:bold; width:280px;">Last Name<br />
<input name="nlast" id="nlast" type="text" alt="Last Name" value=""
size="40" maxlength="60" onfocus="this.select()"
onChange="javascript:this.value=this.value.toUpperCase();
validatePresent(this, 'msg_lname', true);">
</td>
<td> </td>
</tr>
<tr>
<td id="msg_fname"> </td>
<td> </td>
<td id="msg_lname"> </td>
<td> </td>
</tr>
<tr>
<td style="font-weight:bold; text-align:right; width:160px;">Street
Address:</td>
<td colspan="2">
<input name="full_aaddress" id="full_aaddress" type="text" alt="Street
Address" value="" size="40" maxlength="256" onfocus="this.select()"
onChange="javascript:this.value=this.value.toUpperCase();
validatePresent(this, 'msg_address', true);">
</td>
<td id="msg_address"> </td>
</tr>
<tr>
<td style="font-weight:bold; text-align:right; width:160px;
vertical-align:bottom;">City, State ZIP Code:</td>
<td colspan="2">
<input name="full_aaddress" id="full_aaddress2" type="text" alt="City,
State ZIP Code" value="" size="40" maxlength="256"
onfocus="this.select()"
onChange="javascript:this.value=this.value.toUpperCase();
validatePresent(this, 'msg_address2', true);">
</td>
<td id="msg_address2"> </td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
<tr>
<td style="font-weight:bold; text-align:right; width:160px;">Phone
number: </td>
<td colspan="2">
<input name="tphone1" id="tphone1" type="text" alt="Phone number"
value="" size="16" maxlength="12" onfocus="this.select()"
onchange="validateTelnr(this, 'msg_tphone1', true);"> (use format
"xxx-xxx-xxxx")
</td>
<td id="msg_tphone1"> </td>
</tr>
<tr>
<td colspan="4"> </td>
</tr>
</table>
<table style="width:100%; font-size:.8em; text-align:left;">
<tr>
<td style="font-weight:bold; text-align:right; width:160px;">Birthdate:
</td>
<td style="text-align:left; width:100px;">
<select name="ddMonth" onchange="swapBday();">
<option value="" style="font-weight:bold;">Month</option>
<option value="01">January</option>
<option value="02">February</option>
<option value="03">March</option>
<option value="04">April</option>
<option value="05">May</option>
<option value="06">June</option>
<option value="07">July</option>
<option value="08">August</option>
<option value="09">September</option>
<option value="10">October</option>
<option value="11">November</option>
<option value="12">December</option>
</select>
</td>
<td style="text-align:left; width:62px;">
<select name="ddDay" onchange="swapBday();">
<option value="" style="font-weight:bold;">Day</option>
<option value="01">1</option>
<option value="02">2</option>
<option value="03">3</option>
<option value="04">4</option>
<option value="05">5</option>
<option value="06">6</option>
<option value="07">7</option>
<option value="08">8</option>
<option value="09">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select>
</td>
<td style="text-align:left; width:174px;">
<select name="ddYear" onchange="swapBday();">
<option value="" style="font-weight:bold;">Year</option>
<option value="2002">2002</option>
<option value="2001">2001</option>
<option value="2000">2000</option>
<option value="1999">1999</option>
<option value="1998">1998</option>
<option value="1997">1997</option>
<option value="1996">1996</option>
<option value="1995">1995</option>
<option value="1994">1994</option>
<option value="1993">1993</option>
<option value="1992">1992</option>
<option value="1991">1991</option>
<option value="1989">1989</option>
<option value="1988">1988</option>
<option value="1987">1987</option>
<option value="1986">1986</option>
<option value="1985">1985</option>
<option value="1984">1984</option>
<option value="1983">1983</option>
<option value="1982">1982</option>
<option value="1981">1981</option>
<option value="1980">1980</option>
<option value="1979">1979</option>
<option value="1978">1978</option>
<option value="1977">1977</option>
<option value="1976">1976</option>
<option value="1975">1975</option>
<option value="1974">1974</option>
<option value="1973">1973</option>
<option value="1972">1972</option>
<option value="1971">1971</option>
<option value="1970">1970</option>
<option value="1969">1969</option>
<option value="1968">1968</option>
<option value="1967">1967</option>
<option value="1966">1966</option>
<option value="1965">1965</option>
<option value="1964">1964</option>
<option value="1963">1963</option>
<option value="1962">1962</option>
<option value="1961">1961</option>
<option value="1960">1960</option>
<option value="1959">1959</option>
<option value="1958">1958</option>
<option value="1957">1957</option>
<option value="1956">1956</option>
<option value="1955">1955</option>
<option value="1954">1954</option>
<option value="1953">1953</option>
<option value="1952">1952</option>
<option value="1951">1951</option>
<option value="1950">1950</option>
<option value="1949">1949</option>
<option value="1948">1948</option>
<option value="1947">1947</option>
<option value="1946">1946</option>
<option value="1945">1945</option>
<option value="1944">1944</option>
<option value="1943">1943</option>
<option value="1942">1942</option>
<option value="1941">1941</option>
<option value="1940">1940</option>
<option value="1939">1939</option>
<option value="1938">1938</option>
<option value="1937">1937</option>
<option value="1936">1936</option>
<option value="1935">1935</option>
<option value="1934">1934</option>
<option value="1933">1933</option>
<option value="1932">1932</option>
<option value="1931">1931</option>
<option value="1930">1930</option>
<option value="1929">1929</option>
<option value="1928">1928</option>
<option value="1927">1927</option>
<option value="1926">1926</option>
<option value="1925">1925</option>
<option value="1924">1924</option>
<option value="1923">1923</option>
<option value="1922">1922</option>
<option value="1921">1921</option>
<option value="1920">1920</option>
<option value="1919">1919</option>
<option value="1918">1918</option>
<option value="1917">1917</option>
<option value="1916">1916</option>
<option value="1915">1915</option>
<option value="1914">1914</option>
<option value="1913">1913</option>
<option value="1912">1912</option>
</select>
</td>
<input name="F051birthdate" id="F051birthdate" type="hidden"
alt="Birthdate" value="" size="8" maxlength="8" onfocus="this.select()"
onchange="validateBday(this, 'msg_bday', true);">
<td id="msg_bday"> </td>
</tr>
</table>
<table style="width:100%; font-size:.8em; text-align:left;">
<tr>
<td colspan="3"> </td>
</tr>
<tr>
<td style="font-weight:bold; text-align:right; width:160px;">Email
address: </td>
<td style="width:340px;">
<input name="zemailaddr" id="zemailaddr" type="text" alt="Email address"
value="" size="40" maxlength="128" onfocus="this.select()"
onchange="validateEmail(this, 'msg_email', true);"></td>
<td id="msg_email">
</td>
</tr>
<tr><td colspan="3"> </td></tr>
<tr>
<td> </td>
<td colspan="2">
<input type="submit" name="submit" value="Submit">
</td>
</tr>
</table>
<br />
<br />
<input name="cancel" type="reset" value="Clear Form">
</form>
<!--End of main page content-->
</div>
<!--{botlogo}-->
</body>
As far as I know, this validation works in all recent flavors of IE,
Firefox and Mozilla. I've commented much of the javascript, but if you
have specific questions, please let me know. Good luck!
Andrew Welch
Andrew Welch
Sr. Library Systems Technician
Aurora Public Library
Aurora, CO 80247
303/739-6796
>>> peggy dot gaugy at mountainview dot gov >>>
We are in the process of implementing the Patron Self Registration, but
have come across a problem that we need help with. When the patron
fills out the form, if at any time during the process he hits the Enter
key before he clicks on the Submit button, the form goes blank and a
patron record is created with whatever information was entered on the
form. Do we need a javascript to fix this? Also, would anyone be
willing to share their source code for the self registration page that
has javascript validation for the fields on the form? Thanks for any
help.
Peggy
Peggy Gaugy
Librarian
Mountain View Public Library
650.526.7024
peggy dot gaugy at mountainview dot gov
--- StripMime Report -- processed MIME parts ---
multipart/alternative
text/plain (text body -- kept)
text/html
---
--
This message was distributed through the Innovative Users Group INNOPAC list
Public replies: INNOPAC at innopacusers dot org
Update your subscription options:
http://innopacusers.org/mailman/listinfo/innopac