[ 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]
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>&nbsp;</td>

</tr>

<tr>

<td id="msg_fname">&nbsp;</td>

<td>&nbsp;</td>

<td id="msg_lname">&nbsp;</td>

<td>&nbsp;</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">&nbsp;</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">&nbsp;</td>

</tr>

<tr>

<td colspan="4">&nbsp;</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);">&nbsp;(use format

"xxx-xxx-xxxx")

</td>

<td id="msg_tphone1">&nbsp;</td>

</tr>

<tr>

<td colspan="4">&nbsp;</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">&nbsp;</td>

</tr>

</table>

<table style="width:100%; font-size:.8em; text-align:left;">

<tr>

<td colspan="3">&nbsp;</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">&nbsp;

</td>

</tr>

<tr><td colspan="3">&nbsp;</td></tr>

<tr>

<td>&nbsp;</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