From: Subject: Nano-pen prints polymers (May 2007) - News - nanotechweb.org Date: Thu, 31 May 2007 17:22:10 +0300 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_0000_01C7A3A8.38991C20" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/articles/news/6/5/26/1 =EF=BB=BF Nano-pen prints polymers (May 2007) - News - = nanotechweb.org Skip = navigation

A community web site from Institute of Physics = Publishing


IOP: = Publishers of the=20 journal Nanotechnology=20
=20
advanced site = search=20

News

Browse the = archive
2006 2004 2002
=20

quick search

Search news archive

3D""=20 3D""=20 3D""=20

news

<< prev= ious article=20 more articles<= /SMALL>  =20

Nano-pen prints polymers

31 May 2007

Researchers in Israel and France have devised a new = technique to=20 make molecularly imprinted polymers using a nanofountain pen. The = method=20 paves the way to highly stable nanoarrays for multi-analyte = detection.=20 Integrating the polymeric receptor structures with fluid handling = and=20 reading systems could also help make lab-on-a-chip devices, says = the=20 team.

Micro- and nano-biochips could expand the use of arrayed = biosensors in=20 applications such as point-of-care clinical testing, environmental = monitoring and homeland security. Normally, these biochips employ = enzymes=20 or antibodies as sensors but these molecules can be unstable. = Moreover, a=20 natural receptor for a particular target may not always exist. = Scientists=20 would therefore like to create new, tailor-made receptors for = particular=20 molecular targets.

Levi Gheber's team at Ben-Gurion University of the Negev in = Beer-Sheva,=20 together with Karsten Haupt's group at the Compi=C3=A8gne = University of=20 Technology, have now shown that they can do just this. Anne-Sophie = Belmont, in Haupt's group, and colleagues made single = nanostructures with=20 molecular imprints that can be positioned with high precision = using a=20 nanofountain pen. The pen is a hollow glass capillary drawn into a = very=20 sharp tip with an aperture of just a few hundreds of nanometres. =

The "ink" =E2=80=93 which can be proteins, polymers, DNA and = enzymes =E2=80=93 only=20 flows out of the tip of the nanopipette when it is in contact with = a=20 surface to deposit miniscule amounts of solution. The pipette is = mounted=20 as the probe of an atomic force microscope (AFM) and its position = is=20 controlled with nanometre precision.


MIP

Using their technique, the Israel scientists have shown that = they can=20 print proteins, enzymes and polymers onto glass, gold-coated and = silicon=20 substrates. "In principle, the nanofountain pen can print almost = anything=20 on anything," explained Gheber.

The device can also print without lifting the pen off the = substrate.=20 Indeed, the researchers wrote the word "MIP" (for molecularly = imprinted=20 polymers) just to demonstrate this point (see figure). Moreover, = the=20 amount of "ink" in the pen's reservoir is practically unlimited at = these=20 scales.

Gheber told nanotechweb.org that the work paves the way = to=20 making nanoarrays that can detect multiple analytes based on MIPs = that=20 have high stability compared to biological receptors. The arrays = can be=20 imprinted with target molecules for which natural receptors may = not exist.=20 "Integrating polymeric receptor structures with fluid handling and = reading=20 systems (that are also polymer-based) could tremendously advance = the=20 realization of lab-on-chip devices," added Gheber.

The team is now working on printing MIPs that can detect = several=20 analytes on the same array. It also hopes to develop label-free = detection=20 techniques for binding on such small MIP structures.

The researchers reported their work in Appl. Phys. = Lett..

About the author

Belle Dum=C3=A9 is contributing editor at = nanotechweb.org

=20
3D""=20 3D""=20 3D""=20
NewsAlert Sign = up or=20 sign in = to=20 subscribe to our news alerting service or alter your alert = settings=20

links

Related Links

Compi=C3=A8gne=20 University of Technology

Ben Gurion=20 University of the Negev

Pure and = Applied=20 Biochemistry at Lund University, Sweden

Restricted Links

Appl.=20 Phys. Lett. 90 193101

Related Stories

Platinum = nanoclusters go=20 magnetic (January 2007)

Nanocluster = devices aid=20 optical computing (March 2003)

Nanocluster = catalyst=20 aims to clean up fossil fuels (February 2003)

Nanoclusters = bring=20 nanotubes into line (November 2002)

Author

Belle = Dum=C3=A9=20

Tel +44 (0)117 929 7481 | Fax +44 (0)117 930 1178 | = E-mail info@nanotechweb.org
Copyright =C2=A9 IOP Publishing Ltd 1996-2007. All = rights=20 reserved.

------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://nanotechweb.org/images/spacer.gif R0lGODlhAQABAID/AMDAwAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw== ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: application/octet-stream Content-Transfer-Encoding: base64 Content-Location: http://images.iop.org/objects/nano/news/thumb/6/5/26/070526.jpg /9j/4AAQSkZJRgABAAEAlgCWAAD//gAfTEVBRCBUZWNobm9sb2dpZXMgSW5jLiBWMS4wMQD/2wCE AAICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDAgIDAgICAwQDAwMDBAQEAgME BAQEBAMEBAMBAgICAgICAgICAgMCAgIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMD AwMDAwMDAwMDAwMDAwMDA//EAaIAAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKCwEAAwEBAQEB AQEBAQAAAAAAAAECAwQFBgcICQoLEAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+foRAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYS QVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNU VVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5 usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/AABEIAEQAZAMBEQACEQEDEQH/ 2gAMAwEAAhEDEQA/AP2h+O/xQm+C/wAJfGnxOt/D6eKbjwnYWl3B4ek1geHo9UmvdVsNKit5NabT dQGnJvv1czGzuABGRt5yAD8d9e/4LXah4a1ObSdS/Zdthd2+C/2T47297BhiQClxa/Cd43U7SVZW KupWRC0ciO4Bjf8AD8z/AKtd/wDM2f8A4o6AD/h+Z/1a7/5mz/8AFHQB33hL/gr7428c2t5d+FP2 SrHVYtNiluNQjH7R3hqyvLC1hZFkvbzT9Q+HcF1a2AeRFF1JCsLE4VyQcAE2t/8ABXjxr4asrm/1 r9lLQ7C2s5J4Jt37T/gqW4+02yCSezgsrbwJJcXV8iEE2sEUk3IwnNAH6Z/Bv4/2XxV+EPws+Kl3 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 fscynXoqUVH2MJU4JU4uL95RabTe99UzTM6mFq5fnjp01hpU8pSsuVc8vaSWtkt9Xd3m76vRH9O4 6Cv0M/Ejy7wNAkHi/wCKDRQQQJLr2mSbobawt3nkOnHzpZ2svDOmNcymXevm3N3rUxChWvFCC3tw D0DTX81by6A2pcX9z5a7SMR2mzTg+SBvWU2ZmVgMFJlwSAGIA3TW8qTUbIja1rfTSpkqHlg1DGoL MEAG2MXFxdW6tyGNm5zuDAAbeVjUoAKACgAoA8P/AGktF1XxR8C/il4N0aKzN/428CeL/Blrdahf R6fYadfeJvDOr6RpF1ezMjsbaTXLrTLN/KR3QX/nbSkLioqRbp1IreUZJerTSOjCVY0MVhq078lG rTnJLe0ZqTt52R/PcP8Agkz+1uP+Xb4b4/7HSQ/z0ivI/s+t3ivnb9D7lcT5cnoqtu3I3+v6Fa5/ 4JWftQac9lBfXHwztLzUrkWmm2snjC4DXk4XzHSGZdEMaSBRkKzKzDO0EKcZywGKUoxVOPJreXOk l2TW7v5Kx0Q4mylQcnUqxmrWj7J+ralze75dXre3X1nRf+CfX7ffh7wHrXww0nxN4OsvAPiG4a71 nwvH4zhk028unWNWnZZtCZ45SsUfzRun3fWvOr8M06+IjiqlNe1jOlUsq9aFN1KF/ZTnRhKNKc4c zUZThJpaXskaQ4ryeM4VHCftKMJwhUdCLqQhUu5xjPm5km23a9rtvc6z4J/sZ/Gj4G+LfhpqvjLU fAWmab8NfjDofxF8cvB4ukD2vhO7h0bSbZolfTIorqefULfYsLSorMVy2Qdvs4bAVKbg6rUXTnzx 5XfpqtkeNm3EWFrRrUsFCcoYnDujNzXJyvnclJK8r7vsfvppOq6fren2uqaVcrdWF2jPbXCLJGsi pI8L/JKiOhEsbqQyggqeK9Y+LOVn8LXsGsajfaWdF+za7e295qseoWl4Z7WTT9MaCyuNOa1vIwb1 74Ru0xMDRqxZC0iDeB+BftbbxfbJZ24m8LwW0BtoXSCx1Q+TaLpzCQWyNqCgvHqKxRIrFQ9uWkJS RRGwG3lYpSWPjKdo5riDwTJOkelgNJZ6nKyOdSk/tZY5nkDBIdN8qe1O1TLcs8UogjAnIBaW+8aQ ara2MmgaRe6UxVrzXoNafT3iSW91FFS20KWyuZJ5oLCHTpJS97CrSXzrEXEJyAdfQAUAFACEAjBA IBBwRkAg5Bwe+QDQAtACEDjIGV5XIHykjBI9OKAFoAYY4924xpu+XLFF3fKQy84zwwBHoRmgBwAH AGOpwOOpyf1oAWgAoAKACgAoAKAP/9k= ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/css; charset="windows-1255" Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/style/style.css BODY { FONT-FAMILY: Arial, Helvetica, sans-serif; TEXT-ALIGN: center } H1 { FONT-FAMILY: Arial, Helvetica, sans-serif } H2 { FONT-FAMILY: Arial, Helvetica, sans-serif } H3 { FONT-FAMILY: Arial, Helvetica, sans-serif } H4 { FONT-FAMILY: Arial, Helvetica, sans-serif } H5 { FONT-FAMILY: Arial, Helvetica, sans-serif } H6 { FONT-FAMILY: Arial, Helvetica, sans-serif } P { FONT-FAMILY: Arial, Helvetica, sans-serif } LI { FONT-FAMILY: Arial, Helvetica, sans-serif } DIV { FONT-FAMILY: Arial, Helvetica, sans-serif } TD { FONT-FAMILY: Arial, Helvetica, sans-serif } UL.tickboxes LI { LIST-STYLE-TYPE: none } #skipnav { DISPLAY: none } #content H1 { CLEAR: both; MARGIN-TOP: 0px; FONT-WEIGHT: bold; FONT-SIZE: 14px; = MARGIN-BOTTOM: 7px; TEXT-TRANSFORM: lowercase; COLOR: #06c; = BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: left } H2 { CLEAR: both; MARGIN-TOP: 0px; FONT-WEIGHT: bold; FONT-SIZE: 14px; = MARGIN-BOTTOM: 7px; TEXT-TRANSFORM: lowercase; COLOR: #06c; = BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: left } .thead { CLEAR: both; MARGIN-TOP: 0px; FONT-WEIGHT: bold; FONT-SIZE: 14px; = MARGIN-BOTTOM: 7px; TEXT-TRANSFORM: lowercase; COLOR: #06c; = BORDER-BOTTOM: #ccc 1px solid; TEXT-ALIGN: left } .thead { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } H3 { FONT-WEIGHT: bold } .head2 { FONT-WEIGHT: bold } P { FONT-SIZE: 12px; MARGIN: 0.5em 0px; TEXT-ALIGN: left } DD { MARGIN-TOP: 0px; FONT-SIZE: 12px; MARGIN-BOTTOM: 0.5em } INPUT.flatbutton { FONT-WEIGHT: bold; FONT-SIZE: 10px; COLOR: #fff; FONT-FAMILY: Verdana, = Arial, Helvetica, sans-serif; POSITION: relative; TOP: -1px; HEIGHT: = 1.8em; BACKGROUND-COLOR: #006 } A:link { COLOR: #006 } A:visited { COLOR: #333 } A:active { COLOR: #600 } A:hover { COLOR: #f00 } .red { COLOR: #f00 } .searchbox { FONT-WEIGHT: normal; FONT-SIZE: 12px; FONT-FAMILY: Verdana, Arial, = Helvetica, sans-serif } TEXTAREA.searchbox { FONT-SIZE: 10px; FONT-FAMILY: "Courier New", Courier, monospace } FIELDSET { BORDER-RIGHT: black 1px solid; PADDING-RIGHT: 4px; BORDER-TOP: black = 1px solid; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; BORDER-LEFT: black = 1px solid; PADDING-TOP: 4px; BORDER-BOTTOM: black 1px solid } FIELDSET BR { CLEAR: both } FIELDSET LEGEND { FONT-WEIGHT: bold; COLOR: black } FIELDSET FIELDSET LEGEND { FONT-WEIGHT: normal; COLOR: black; FONT-STYLE: italic } LABEL { PADDING-RIGHT: 2px; DISPLAY: block; PADDING-LEFT: 0px; FLOAT: left; = PADDING-BOTTOM: 0px; WIDTH: 140px; PADDING-TOP: 0px; TEXT-ALIGN: right } LABEL.checkbox { DISPLAY: inline; FLOAT: none; WIDTH: auto; TEXT-ALIGN: left } LABEL.radio { DISPLAY: inline; FLOAT: none; WIDTH: auto; TEXT-ALIGN: left } LABEL[for] { CURSOR: pointer } ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/css; charset="windows-1255" Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/common/style/cws.css #memberlogin { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px } #memberlogin * { BORDER-TOP-WIDTH: 0px; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; = BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: 0px; = MARGIN: 0px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px } #memberlogin A { TEXT-DECORATION: none } #memberlogin P { FONT-SIZE: x-small } #memberlogin LI { FONT-SIZE: x-small } #memberlogin P { FLOAT: left } #memberlogin UL { MARGIN-TOP: -2px; FLOAT: right } * HTML #memberlogin UL { MARGIN-TOP: 0px } #memberlogin LI { PADDING-RIGHT: 3px; DISPLAY: inline; PADDING-LEFT: 6px; BORDER-LEFT: = #f00 1px solid } #memberlogin LI:first-child { BORDER-LEFT-WIDTH: 0px } #memberlogin LI.cwsAdmin:unknown { content: ' ?' } A.restricted { PADDING-LEFT: 20px; BACKGROUND: = url(http://images.iop.org/cws/padlock.gif) no-repeat left top } .clearer { CLEAR: both } FORM#form-cws-login FIELDSET.compact DIV { CLEAR: both! important } FORM#form-cws-login FIELDSET.compact LABEL { WIDTH: 200px } FORM#form-cws-login FIELDSET.compact INPUT { WIDTH: 250px } FORM#form-cws-login FIELDSET.compactLabelAfter INPUT { WIDTH: auto } FORM#form-cws-login FIELDSET.compact FIELDSET.compactLabelAfter { BORDER-TOP-WIDTH: 0px; CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: = 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; PADDING-BOTTOM: = 0px; MARGIN-LEFT: 200px; PADDING-TOP: 0px; BORDER-RIGHT-WIDTH: 0px } FORM#form-cws-login FIELDSET.compact FIELDSET.compactLabelAfter LABEL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; WIDTH: 250px; PADDING-TOP: 0px; TEXT-ALIGN: left } ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/css; charset="windows-1255" Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/common/style/forms.css FIELDSET DIV SELECT { PADDING-RIGHT: 0px! important; PADDING-LEFT: 0px! important; = PADDING-BOTTOM: 0px! important; PADDING-TOP: 0px! important } FIELDSET { MARGIN: 1em 0px } LABEL { CURSOR: hand } FIELDSET { PADDING-RIGHT: 0.5em; PADDING-LEFT: 0.5em; PADDING-BOTTOM: 0.5em; = PADDING-TOP: 0.5em } FIELDSET.compact DIV { CLEAR: both } .clearer { CLEAR: both } DIV.clearer { HEIGHT: 0px } FIELDSET.compact DIV LABEL { PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; FLOAT: left; PADDING-BOTTOM: = 0.2em; WIDTH: 65%; PADDING-TOP: 0.2em } FIELDSET.compact DIV INPUT { PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; FLOAT: left; PADDING-BOTTOM: = 0.2em; WIDTH: 65%; PADDING-TOP: 0.2em } FIELDSET.compact DIV SELECT { PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; FLOAT: left; PADDING-BOTTOM: = 0.2em; WIDTH: 65%; PADDING-TOP: 0.2em } FIELDSET.compact DIV TEXTAREA { PADDING-RIGHT: 0.2em; PADDING-LEFT: 0.2em; FLOAT: left; PADDING-BOTTOM: = 0.2em; WIDTH: 65%; PADDING-TOP: 0.2em } FIELDSET.compact DIV LABEL { FONT-WEIGHT: normal; WIDTH: 30%; LINE-HEIGHT: 1.75em; TEXT-ALIGN: right } FIELDSET.list DIV LABEL { FONT-WEIGHT: bold } FIELDSET.list DIV > * { PADDING-RIGHT: 0.2em; DISPLAY: block; PADDING-LEFT: 0.2em; = PADDING-BOTTOM: 0.2em; PADDING-TOP: 0.2em } FIELDSET.listLabelAfter LABEL { CLEAR: both; DISPLAY: block; WIDTH: 95%; TEXT-ALIGN: left } FIELDSET.compactLabelAfter LABEL { DISPLAY: inline; WIDTH: auto; WHITE-SPACE: nowrap } FORM.miniForm * { DISPLAY: block } FORM.midiForm LABEL { DISPLAY: block } ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/css; charset="windows-1255" Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/style/nu.css @import url( /common/style/cws.css ); @import url( /common/style/forms.css ); BODY { TEXT-ALIGN: center } BODY#home H3 { MARGIN: 0px } BODY#home #content P { MARGIN: 0px 0px 0.75em } #homenanojnl { CLEAR: both; PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: = 2px; MARGIN: 0px; PADDING-TOP: 2px } #homenanojnl P { FLOAT: left; MARGIN-RIGHT: 10px } #homenanojnl UL { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FLOAT: left; PADDING-BOTTOM: = 0px; MARGIN: 0px; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } #homenanojnl UL LI { PADDING-LEFT: 16px; BACKGROUND: url(/images/arrow.gif) no-repeat 0px = 4px; MARGIN: 0px } UL.leftmenu { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0.5em 0px 1em; PADDING-TOP: 0px; LIST-STYLE-TYPE: none } UL.leftmenu LI { DISPLAY: inline } UL.leftmenu LI A { PADDING-RIGHT: 2px; DISPLAY: block; PADDING-LEFT: 16px; FONT-WEIGHT: = normal; BACKGROUND: url(/images/arrow.gif) no-repeat 2px 7px; = PADDING-BOTTOM: 4px; MARGIN: 0px; PADDING-TOP: 4px; BORDER-BOTTOM: #ccc = 1px solid } UL.more { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em = 0px; PADDING-TOP: 0px } UL.more LI { DISPLAY: inline; PADDING-LEFT: 12px; BACKGROUND: url(/images/arrow.gif) = no-repeat 0px 50%; LIST-STYLE-TYPE: none } UL.more A { MARGIN-RIGHT: 10px; WHITE-SPACE: nowrap } A.rss { BACKGROUND-POSITION: 0px 50%; PADDING-LEFT: 40px; BACKGROUND-IMAGE: = url(http://syndication.iop.org/images/xml.gif); BACKGROUND-REPEAT: = no-repeat; POSITION: relative } DIV#maindiv { MARGIN: 0px auto; WIDTH: 760px; TEXT-ALIGN: left } DIV.navbar { MARGIN: 0px 0px 0px -8px } DIV.navbar SPAN { DISPLAY: none } #footer DIV.navbar { MARGIN: 10px 0px 10px -8px } DIV.navbar A { BORDER-RIGHT: #06c 1px solid; PADDING-RIGHT: 10px; DISPLAY: block; = PADDING-LEFT: 6px; FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: 2px 3px; = COLOR: #000; PADDING-TOP: 0px; FONT-FAMILY: Arial, Helvetica, = sans-serif; LETTER-SPACING: 0.05em; TEXT-DECORATION: none } #memberlogin UL { MARGIN-TOP: -5px } #memberlogin LI { BORDER-LEFT-COLOR: #06c; BORDER-BOTTOM-COLOR: #06c; BORDER-TOP-COLOR: = #06c; BORDER-RIGHT-COLOR: #06c } DIV.navbar A:hover { COLOR: #06c } DIV.navbar A.navbarsel { COLOR: #f00 } .spotlight { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 16px; = BORDER-LEFT: #ccc 1px solid; WIDTH: 158px; PADDING-TOP: 0px; = BORDER-BOTTOM: #ccc 1px solid; POSITION: relative; voice-family: inherit } HTML > .spotlight { WIDTH: 158px } .spotlight H2 { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; = PADDING-TOP: 4px; BORDER-BOTTOM: #ccc 1px solid } .featured H2 { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; = PADDING-TOP: 4px; BORDER-BOTTOM: #ccc 1px solid } .boxout { BORDER-RIGHT: #06c 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: #06c 1px = solid; PADDING-LEFT: 0px; MARGIN-BOTTOM: 1em; PADDING-BOTTOM: 0px; = BORDER-LEFT: #06c 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #06c 1px = solid } .boxout H3 { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; MARGIN: = 0px; COLOR: #06c; PADDING-TOP: 1px; BORDER-BOTTOM: #06c 1px solid } .boxout H2 { PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 1px; MARGIN: = 0px; COLOR: #06c; PADDING-TOP: 1px; BORDER-BOTTOM: #06c 1px solid } .boxout P { MARGIN: 0.5em } .spotlight P { MARGIN: 0.5em } .left { FLOAT: left } .right { FLOAT: right } P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0.5em; = PADDING-TOP: 0px } H1 + P { MARGIN: 0px 0px 1em } H2 + P { MARGIN: 0px 0px 1em } DIV.featured P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 4px; MARGIN: = 0px; PADDING-TOP: 4px; BORDER-BOTTOM: #ccc 1px solid } #footer { BORDER-TOP: #ccc 1px solid; MARGIN: 10px auto 0px; WIDTH: 760px } #content H1 { FONT-SIZE: medium; voice-family: inherit } H2 { FONT-SIZE: medium; voice-family: inherit } #arthead { FONT-SIZE: medium; voice-family: inherit } .thead { FONT-SIZE: medium; voice-family: inherit } P { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } H3 { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } .boxout H2 { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } .spotlight H2 { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } .featured H2 { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } .txt { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } FORM { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } LI { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } TD { FONT-SIZE: small; TEXT-ALIGN: left; voice-family: inherit } DIV.navbar { FONT-SIZE: x-small; voice-family: inherit } .sml { FONT-SIZE: x-small; voice-family: inherit } .tny { FONT-SIZE: x-small; voice-family: inherit } .navbar { PADDING-RIGHT: 0px; PADDING-LEFT: 10px; PADDING-BOTTOM: 20px; MARGIN: = 0px 0px 0px -18px; PADDING-TOP: 0px } .navbar LI { PADDING-RIGHT: 0px; DISPLAY: inline; PADDING-LEFT: 0px; PADDING-BOTTOM: = 0px; MARGIN: 0px; TEXT-TRANSFORM: lowercase; PADDING-TOP: 0px; = LIST-STYLE-TYPE: none } #footer .navbar { MARGIN: 10px 0px 10px -8px } .navbar A { BORDER-RIGHT: #06c 1px solid; PADDING-RIGHT: 10px; PADDING-LEFT: 10px; = FLOAT: left; PADDING-BOTTOM: 0px; MARGIN: 0px 0px 4px; COLOR: #000; = PADDING-TOP: 0px; WHITE-SPACE: nowrap; LETTER-SPACING: 0.05em; = TEXT-DECORATION: none } .navbar A:hover { COLOR: #06c } BODY#home A.nav-home { CURSOR: default; COLOR: #f00 } BODY#newshome A.nav-news { CURSOR: default; COLOR: #f00 } BODY#news A.nav-news { CURSOR: default; COLOR: #f00 } BODY#societyhome A.nav-society { CURSOR: default; COLOR: #f00 } BODY#society A.nav-society { CURSOR: default; COLOR: #f00 } BODY#columnhome A.nav-opinion { CURSOR: default; COLOR: #f00 } BODY#column A.nav-opinion { CURSOR: default; COLOR: #f00 } BODY#feature A.nav-features { CURSOR: default; COLOR: #f00 } BODY#featurehome A.nav-features { CURSOR: default; COLOR: #f00 } BODY#journal A.nav-journal { CURSOR: default; COLOR: #f00 } BODY#buyers A.nav-buyers { CURSOR: default; COLOR: #f00 } BODY#resources A.nav-links { CURSOR: default; COLOR: #f00 } BODY#events A.nav-events { CURSOR: default; COLOR: #f00 } BODY#yournews A.nav-yournews { CURSOR: default; COLOR: #f00 } BODY#jobs A.nav-jobs { CURSOR: default; COLOR: #f00 } BODY#contact A.nav-contact { CURSOR: default; COLOR: #f00 } BODY#advertising A.nav-advertising { CURSOR: default; COLOR: #f00 } DIV#header1 A { TEXT-DECORATION: none } DIV#header2 A { TEXT-DECORATION: none } DIV#header1 { FLOAT: left; MARGIN: 0px 0px 1.25em; WIDTH: 590px } DIV#header1 #logo { DISPLAY: block; BACKGROUND: url(/images/header_logo.gif) no-repeat; = MARGIN: 0px 0px 20px; TEXT-INDENT: -100em; LINE-HEIGHT: 68px; HEIGHT: = 68px } DIV#header2 { FLOAT: right; MARGIN: 0.5em 0px 0px; WIDTH: 160px } A#colophon { DISPLAY: block; BACKGROUND: url(/images/colophon.gif) no-repeat 0px = 0px; MARGIN-BOTTOM: 1em; WIDTH: 160px; TEXT-INDENT: -9999px; HEIGHT: = 62px } .clearer { CLEAR: both } FIELDSET.compact LABEL:hover { BACKGROUND-COLOR: #eee } FIELDSET.list LABEL:hover { BACKGROUND-COLOR: #eee } FIELDSET.listLabelAfter LABEL:hover { BACKGROUND-COLOR: #eee } FIELDSET.compactLabelAfter LABEL:hover { BACKGROUND-COLOR: #eee } FIELDSET.actions { BACKGROUND-COLOR: rgb(249,249,249) } INPUT.primary { FONT-WEIGHT: bold; FONT-SIZE: medium; FLOAT: right; COLOR: white; = BACKGROUND-COLOR: #006 } FIELDSET { BORDER-RIGHT: #ccc 0px solid; BORDER-TOP: #ccc 1px solid; BORDER-LEFT: = #ccc 0px solid; BORDER-BOTTOM: #ccc 0px solid } #content FORM .required:unknown { FONT-WEIGHT: bold; FONT-SIZE: large; VERTICAL-ALIGN: -0.35em; COLOR: = #f00; LINE-HEIGHT: 0.4em; content: " *" } * HTML #content FORM .required { BACKGROUND: url(../images/asterisk_red.png) no-repeat 100% 50% } P.formMessage { BORDER-RIGHT: #ccc 1px solid; PADDING-RIGHT: 1em; BORDER-TOP: #ccc 1px = solid; PADDING-LEFT: 1em; FONT-WEIGHT: bold; PADDING-BOTTOM: 1em; = MARGIN: 1em; BORDER-LEFT: #ccc 1px solid; COLOR: #000; PADDING-TOP: 1em; = BORDER-BOTTOM: #ccc 1px solid; BACKGROUND-COLOR: #ffc; TEXT-ALIGN: = center } .standout { BORDER-RIGHT: #06c 1px solid; PADDING-RIGHT: 0.5em; BORDER-TOP: #06c = 1px solid; PADDING-LEFT: 0.5em; PADDING-BOTTOM: 0.5em; BORDER-LEFT: #06c = 1px solid; PADDING-TOP: 0.5em; BORDER-BOTTOM: #06c 1px solid } ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: text/css; charset="windows-1255" Content-Transfer-Encoding: 7bit Content-Location: http://nanotechweb.org/style/iefixes.css #homenanojnl UL { FLOAT: none; MARGIN-LEFT: 140px } #content FORM .required { PADDING-RIGHT: 14px; MARGIN-LEFT: -6px } ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://nanotechweb.org/common/scripts/form_ctl.js // JAVASCRIPT FORM CONTROL FUNCTIONS=0A= =0A= // Select or deselect a group of checkboxes=0A= function select_all(form, group, val) {=0A= // We could receive a form name or object - we want an object=0A= if (typeof(form) !=3D "object") { form =3D document.forms[form]; }=0A= if (typeof(form) !=3D "object") {=0A= alert("Syntax: select_all() expects a form as the first = argument.");=0A= return false;=0A= }=0A= =0A= // We could receive a form element name or object - we want the name=0A= if (typeof(group) =3D=3D "object") { group =3D group.name; }=0A= if (typeof(form.elements[group]) !=3D "object") {=0A= alert("Syntax: select_all() expects a checkbox group as the second = argument.");=0A= return false;=0A= }=0A= if (typeof(form.elements[group][0]) !=3D "object") {=0A= alert("Syntax: select_all() expects a checkbox group as the second = argument.");=0A= return false;=0A= }=0A= =0A= // Check or uncheck all the checkboxes=0A= for (i =3D 0; i < form.elements[group].length; i++) {=0A= form.elements[group][i].checked =3D val;=0A= }=0A= return false;=0A= }=0A= =0A= // Redirect user to the URL specified in the field value=0A= function surfto(form, selection, scope) {=0A= // We could receive a form name or object - we want an object=0A= if (typeof(form) !=3D "object") { form =3D document.forms[form]; }=0A= if (typeof(form) !=3D "object") {=0A= alert("Syntax: surfto() expects a form as the first argument.");=0A= return false;=0A= }=0A= =0A= // We could receive a form element name or object - we want the object=0A= if (typeof(selection) !=3D "object") { selection =3D = form.elements[selection]; }=0A= if (=0A= (typeof(selection) !=3D "object") ||=0A= (typeof(selection[0]) !=3D "object")=0A= ) {=0A= alert("Syntax: surfto() expects a drop-down list as the second = argument.");=0A= return false;=0A= }=0A= =0A= var myindex=3Dselection.selectedIndex;=0A= // var mag=3Dselection.options[myindex].value;=0A= if (selection.options[myindex].value !=3D "0") {=0A= =0A= // Change current window/frame location=0A= if (scope=3D=3D0) {=0A= // alert(form.action);=0A= // alert(typeof(form.action));=0A= // alert(selection.options[myindex].value);=0A= if (typeof(form.action) =3D=3D "string") {=0A= window.location=3Dselection.options[myindex].value;=0A= } else {=0A= window.location=3D"index.cfm?action=3D" + form.action.value + = "&" + selection.name + "=3D" + selection.options[myindex].value;=0A= }=0A= }=0A= // Change top-level frame location=0A= else if (scope=3D=3D1) {=0A= top.location=3Dselection.options[myindex].value;=0A= }=0A= else if (scope=3D=3D2) {=0A= // Open new window (400x480)=0A= = window.open(selection.options[myindex].value,"","scrollbars,resizable,wid= th=3D400,height=3D480");=0A= }=0A= }=0A= return false;=0A= }=0A= =0A= // Get the current value of an drop-down list=0A= function get_select_option(element)=0A= {=0A= // Sanity check=0A= if (typeof(element) !=3D "object") {=0A= alert("form_ctl.js: get_select_option() requires an object, but = was passed a(n) " + typeof(element) + "!");=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // Get value =0A= var val =3D null;=0A= for (var j =3D 0; j < element.length; j++) {=0A= if (element[j].selected) {=0A= val =3D element[j].value;=0A= }=0A= }=0A= return val;=0A= }=0A= =0A= // Set the current value of an drop-down list=0A= function set_select_option(element, val)=0A= {=0A= // Sanity check=0A= if (typeof(element) !=3D "object") {=0A= alert("form_ctl.js: set_select_option() requires an object, but = was passed a(n) " + typeof(element) + "!");=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // Get value=0A= for (var j =3D 0; j < element.length; j++) {=0A= if (val =3D=3D element[j].value) {=0A= element[j].selected =3D true;=0A= }=0A= else {=0A= element[j].selected =3D false;=0A= }=0A= }=0A= return val;=0A= }=0A= =0A= // Get the value of a form element whatever it is=0A= function value(element) {=0A= // Sanity check=0A= if (typeof(element) !=3D "object") {=0A= alert("form_ctl.js: value() requires an object, but was passed = a(n) " + typeof(element) + "!");=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // If value is non-null, return it=0A= if (element.value !=3D null) {=0A= return element.value;=0A= // NOTREACHED=0A= }=0A= =0A= // If selected option found, return it=0A= var val =3D get_select_option(element);=0A= if (val !=3D null) {=0A= return val;=0A= // NOTREACHED=0A= }=0A= =0A= // XXX Fallthrough=0A= alert("Value of element '" + element.id + "' was not found.");=0A= return null;=0A= }=0A= =0A= // Set the value of a form element whatever it is=0A= function set(element, val) {=0A= // Sanity check=0A= if (typeof(element) !=3D "object") {=0A= alert("form_ctl.js: set() requires an object, but was passed a(n) = " + typeof(element) + "!");=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // If value is non-null, return it=0A= if (element.value !=3D null) {=0A= element.value =3D val;=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // If selected option found, return it=0A= var dummy =3D get_select_option(element);=0A= if (val !=3D null) {=0A= set_select_option(element, val);=0A= return null;=0A= // NOTREACHED=0A= }=0A= =0A= // XXX Fallthrough=0A= alert("Value of element '" + element.id + "' was not found.");=0A= return null;=0A= }=0A= =0A= // Copy Address from one set of address fields to another=0A= function copy_address (thisform, source, dest) {=0A= field_list =3D = 'ContactName,OrgName,Street,City,County,Postcode,Country,Phone,Fax,Email,= URL';=0A= field_array =3D field_list.split(',');=0A= =0A= for (i=3D0; i "") {=0A= =0A= while (i=3D minVal)) &&=0A= ((maxVal.length =3D=3D 0) || (val.length <=3D maxVal))=0A= );=0A= // NOTREACHED=0A= }=0A= =0A= // Validate an alphanumeric string=0A= function validate_alnum(theForm, elemName, minVal, maxVal)=0A= {=0A= // Check that all the characters in the string are alphanumeric=0A= var val =3D value(theForm.elements[elemName]);=0A= return (=0A= (val.match(/^[a-z0-9]*$/i)) &&=0A= validate_string(theForm, elemName, minVal, maxVal)=0A= );=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a submitted URL=0A= function validate_url(theForm, elemName, minVal, maxVal)=0A= {=0A= // Special case - if no minimum length specified, empty value is = allowed=0A= var val =3D value(theForm.elements[elemName]);=0A= if ((!minVal) && (!(val.length))) {=0A= return(true);=0A= // NOTREACHED=0A= }=0A= =0A= // Very simple validation: check that the hostname has at least two=0A= // elements, separated by a '.' character, and check that the last=0A= // element contains only alphanumeric characters. It's not a catchall=0A= // but it'll do for now.=0A= var hostname =3D val.replace(/^[a-z]+:\/*/i, "");=0A= hostname =3D hostname.replace(/\/.*$/, "");=0A= return (=0A= (hostname.match(/^[a-z0-9_-]+\.[a-z0-9_-]+/i)) &&=0A= (hostname.match(/[a-z0-9_-]+\.[a-z]{2,4}$/i)) &&=0A= validate_string(theForm, elemName, minVal, maxVal)=0A= );=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a submitted email address=0A= function validate_email(theForm, elemName, minVal, maxVal)=0A= {=0A= // Special case - if no minimum length specified, empty value is = allowed=0A= var val =3D value(theForm.elements[elemName]);=0A= if ((!minVal) && (!(val.length))) {=0A= return(true);=0A= // NOTREACHED=0A= }=0A= =0A= // Very simple validation: check the hostname as for URL checking = above.=0A= // Check that user names don't contain invalid characters.=0A= var username =3D val.replace(/@[^@]+$/, "");=0A= var hostname =3D val.replace(/^[^@]+@/, "");=0A= return (=0A= (hostname.match(/^[a-z0-9_-]+\.[a-z0-9_-]+/i)) &&=0A= (hostname.match(/[a-z0-9_-]+\.[a-z]{2,4}$/i)) &&=0A= (username.match(/^[^@<>()"',;\[\]\\ ]+$/i)) &&=0A= validate_string(theForm, elemName, minVal, maxVal)=0A= );=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a date field generated by the input_date custom tag=0A= function validate_date(theForm, elemName, minVal, maxVal)=0A= {=0A= // If any of the required sub-elements are undefined, form is invalid=0A= if (=0A= (typeof(theForm.elements[elemName + "_day"]) !=3D "object") ||=0A= (typeof(theForm.elements[elemName + "_month"]) !=3D "object") ||=0A= (typeof(theForm.elements[elemName + "_year"]) !=3D "object")=0A= ) {=0A= return("Missing date elements for '" + elemName + "'");=0A= // NOTREACHED=0A= }=0A= =0A= // if the minVal and the maxVal are passed through as 0 then blank = dates are allowed =0A= if (minVal =3D=3D 0 && maxVal =3D=3D0 && theForm.elements[elemName + = "_day"].value =3D=3D ""){=0A= // the date string is empty, but this is allowed in this case so = return true=0A= return (true);=0A= } else if ( minVal =3D=3D 0 && maxVal =3D=3D0) {=0A= // if the date is not empty then remove minValue and maxVal as = both being zero will result in a date that does not make sense=0A= minVal =3D "";=0A= maxVal =3D "";=0A= }=0A= =0A= // Convert to a date.=0A= var day =3D value(theForm.elements[elemName + "_day"]);=0A= var month =3D value(theForm.elements[elemName + "_month"]);=0A= var year =3D value(theForm.elements[elemName + "_year"]);=0A= var mydate =3D new Date(year, month - 1, day);=0A= var month_check =3D mydate.getMonth() + 1;=0A= if (=0A= (month_check =3D=3D month) &&=0A= ((minVal.length =3D=3D 0) || (year >=3D minVal)) &&=0A= ((maxVal.length =3D=3D 0) || (year <=3D maxVal))=0A= ) {=0A= set(theForm.elements[elemName], (String(year) +=0A= (month < 10 ? "0" : "") + String(month) +=0A= (day < 10 ? "0" : "") + String(day)));=0A= return(true);=0A= // NOTREACHED=0A= }=0A= =0A= // Date is incorrect - change day to number of days in the month=0A= newDay =3D (=0A= 28 + (=0A= (month =3D=3D 2) ? (=0A= (year % 4 =3D=3D 0) && ((year % 100 !=3D 0) || (year % 400 = =3D=3D 0)) ? 1 : 0=0A= ) : (=0A= (month =3D=3D 4 || month =3D=3D 6 || month =3D=3D 9 || month = =3D=3D 11) ? 2 : 3=0A= )=0A= )=0A= );=0A= set(theForm.elements[elemName + "_day"], newDay);=0A= return(false);=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a checkbox group (where at least one must be checked)=0A= function validate_checkbox_group(theForm, elemName)=0A= {=0A= // Loop through each of the checkboxes=0A= var is_any_checkbox_checked =3D 0;=0A= for (j =3D 0; j < theForm.elements[elemName].length; j++) {=0A= if (theForm.elements[elemName][j].checked) {=0A= is_any_checkbox_checked =3D 1;=0A= }=0A= }=0A= return(is_any_checkbox_checked);=0A= // NOTREACHED=0A= }=0A= =0A= // Validate an option group (where a non-empty value is to be selected)=0A= function validate_option_group(theForm, elemName)=0A= {=0A= // Loop through each of the checkboxes=0A= var val=3Dget_select_option(theForm.elements[elemName]);=0A= return ((val !=3D null) && val.length);=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a numeric field=0A= function validate_numeric(theForm, elemName, minVal, maxVal,=0A= minPrecision, maxPrecision, optional)=0A= {=0A= // If field contains an empty string, return valid if=0A= // field is 'optional', invalid otherwise.=0A= var val =3D value(theForm.elements[elemName]);=0A= if (!(val.length)) {=0A= return (optional.length > 0);=0A= }=0A= =0A= // Generate pattern to match numeric field=0A= var temp_re =3D "^([-]?)([0-9]*)";=0A= if (maxPrecision !=3D 0) {=0A= temp_re +=3D "(\\.[0-9]{" +=0A= ((minPrecision > 0) ? minPrecision : 1) + "," + maxPrecision +=0A= "})" + ((minPrecision > 0) ? "" : "?");=0A= }=0A= temp_re +=3D "$";=0A= var regex =3D new RegExp(temp_re);=0A= =0A= // Determine whether field matches our criteria=0A= return(=0A= (val.length > 0)=0A= && (val !=3D '-')=0A= && (val.match(regex))=0A= && (val.match(regex).length !=3D 0)=0A= && ((minVal.length =3D=3D 0) || (val - minVal >=3D 0))=0A= && ((maxVal.length =3D=3D 0) || (maxVal - val >=3D 0))=0A= );=0A= // NOTREACHED=0A= }=0A= =0A= // Validate a list; valid if field value is contained in list=0A= // if 'rev' is true, reverses the sense of the validation=0A= function validate_list(theForm, elemName, list, delim, rev)=0A= {=0A= // Empty values can't appear in lists=0A= var val =3D value(theForm.elements[elemName]);=0A= if (!(val.length)) {=0A= return(rev);=0A= // NOTREACHED=0A= }=0A= =0A= if (typeof(theForm.elements[list]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field value list '" + list +=0A= "' for field '" + elemName + "' of type " +=0A= (rev ? "NOT_IN" : "IN"));=0A= // NOTREACHED=0A= }=0A= var newlist =3D value(theForm.elements[list]).split(delim);=0A= var i, valid =3D rev;=0A= =0A= // Search through list for submitted value=0A= for (j =3D 0; j < newlist.length; j++) {=0A= if (newlist[j].toLowerCase() =3D=3D val.toLowerCase()) { valid = =3D (!rev); }=0A= }=0A= return(valid);=0A= }=0A= =0A= // Validate a field that must match another field in the same form=0A= // (e.g. password change verification)=0A= function validate_equal(theForm, elemName, elemNameToo)=0A= {=0A= if (typeof(theForm.elements[elemNameToo]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field '" + elemNameToo +=0A= "' for field '" + elemName + "' of type EQUAL");=0A= // NOTREACHED=0A= }=0A= return(value(theForm.elements[elemName]) =3D=3D = value(theForm.elements[elemNameToo]));=0A= }=0A= =0A= // Validate a field that must be greater in value=0A= // than another field in the same form=0A= function validate_greater_than(theForm, elemName, elemNameToo)=0A= {=0A= if (typeof(theForm.elements[elemNameToo]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field '" + elemNameToo +=0A= "' for field '" + elemName + "' of type GT");=0A= // NOTREACHED=0A= }=0A= return(value(theForm.elements[elemName]) > = value(theForm.elements[elemNameToo]));=0A= }=0A= =0A= // Validate a field that must be smaller in value=0A= // than another field in the same form=0A= function validate_smaller_than(theForm, elemName, elemNameToo)=0A= {=0A= if (typeof(theForm.elements[elemNameToo]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field '" + elemNameToo +=0A= "' for field '" + elemName + "' of type LT");=0A= // NOTREACHED=0A= }=0A= return(value(theForm.elements[elemName]) < = value(theForm.elements[elemNameToo]));=0A= }=0A= =0A= // Validate a field that must be greater than or equal to=0A= // another field in the same form=0A= function validate_greater_or_equal(theForm, elemName, elemNameToo)=0A= {=0A= if (typeof(theForm.elements[elemNameToo]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field '" + elemNameToo +=0A= "' for field '" + elemName + "' of type GE");=0A= // NOTREACHED=0A= }=0A= return(value(theForm.elements[elemName]) >=3D = value(theForm.elements[elemNameToo]));=0A= }=0A= =0A= // Validate a field that must be smaller than or equal to=0A= // another field in the same form=0A= function validate_smaller_or_equal(theForm, elemName, elemNameToo)=0A= {=0A= if (typeof(theForm.elements[elemNameToo]) !=3D "object") {=0A= // RETURN WARNING=0A= return("Missing field '" + elemNameToo +=0A= "' for field '" + elemName + "' of type LE");=0A= // NOTREACHED=0A= }=0A= return(value(theForm.elements[elemName]) <=3D = value(theForm.elements[elemNameToo]));=0A= }=0A= =0A= =0A= // Validate all required fields in a form=0A= function validate_form(theForm)=0A= {=0A= var i;=0A= var required_fields =3D new Array;=0A= var bad_fields =3D new Array;=0A= var warnings =3D new Array;=0A= =0A= =0A= // If the form element 'required' exists, use the value of this = element=0A= // to determine which fields are to be validated. The 'required' = element=0A= // should be a comma-separated list of field definitions. If the = element=0A= // does not exist, no validation is performed.=0A= //=0A= // Each field definition takes the form:=0A= // field name:description:data type[:optional additional = definitions]=0A= // Valid data types are: 'url', 'email', 'alnum', 'date', = 'checkbox_group',=0A= // 'option_group', 'numeric', 'integer',=0A= // 'in', 'not_in', 'equal', 'eq', 'gt', 'lt',=0A= // 'lte', 'le' ,'gte', 'ge'=0A= //=0A= // =0A= // A field may have more than one definition, though why you would = want=0A= // to do this is anybody's guess.=0A= //=0A= // For all string fields (including unrecognised data types), you may = also=0A= // specify the minimum and maximum string length (in that order) = after the=0A= // data type.=0A= //=0A= // e.g. A password which must be at least 6 characters in length=0A= // password:Password:string:6:=0A= // =0A= // String fields with an undefined (or zero) minimum length denotes a=0A= // field that may be left blank. For string fields which must contain=0A= // a value, some minimum length must be defined in the 'required' = field.=0A= //=0A= // For Date, Numeric and Integer fields, you may also specify the = minimum=0A= // and maximum allowed values (in that order) after the data type. For=0A= // dates, the minimum and maximum values are treated as the earliest = and=0A= // latest years that are allowed. If a date field has a minimum and = maximum =0A= // value of 0 then empty values are allowed (sometimes a date may be = optional but =0A= // still be required to be valid if present)=0A= // Numeric fields may include the minimum and maximum number of digits=0A= // allowed after the decimal point.=0A= //=0A= // e.g. A table tell width, which must be an integer between 320 and = 800=0A= // cellWidth:Table cell width:integer:320:800=0A= //=0A= // e.g. A currency field, which must be positive and have two digits = after=0A= // the decimal point=0A= // itemPrice:Item price:numeric:0::2:2=0A= //=0A= // e.g. An embargo date, which must be a year between 2001 and 2010=0A= // the decimal point=0A= // embargoDate:Embargo date:date:2001:2010=0A= // =0A= // The "In"/"Not_In" data types take as parameters: (1) the fieldname = of=0A= // the list of elements which must not appear in the submitted field, = and=0A= // (2) the character delimiter of the above list (optional; default = comma).=0A= // The supplied fieldname should be the fieldname of a hidden input = item=0A= // in the same form, containing the list of values delimited by the=0A= // (default or supplied) delimiter.=0A= //=0A= // e.g. A numeric ID, which must be either 4, 5 or 6=0A= // someID:Some numeric ID:in:id_list=0A= //=0A= // The hidden field will then read as follows:=0A= // =0A= //=0A= // e.g. A site ID, which must be three characters long and must NOT be=0A= // 'opo' or 'fse'=0A= // siteID:Site ID::3:3,siteID:Site ID:not_in:site_id_list=0A= //=0A= // The hidden field will then read as follows:=0A= // =0A= // =0A= // The "Equal" data type takes as its parameter the fieldname of the = field=0A= // whose value it should match, e.g. password fields:=0A= //=0A= // password:Password:equal:password_verify=0A= //=0A= // The HTML fields would look something like:=0A= // Enter password:
=0A= // Verify password:
=0A= //=0A= // Any unrecognised data type is assumed to be a normal string.=0A= =0A= // Parse the 'required' field element=0A= // Generate a warning if it does not exist=0A= if (typeof(theForm.elements["required"]) =3D=3D "object") {=0A= if (typeof(theForm.elements["required"].length) =3D=3D "number") {=0A= for (i =3D 0; i < theForm.elements["required"].length; i++) {=0A= if (typeof(theForm.elements["required"][i].value) !=3D = "undefined") {=0A= required_fields[i] =3D = theForm.elements["required"][i].value;=0A= }=0A= else {=0A= // SHOULD NEVER HAPPEN=0A= required_fields[i] =3D 'Parser Error!:-:ERROR'; // dummy = field=0A= warnings[warnings.length] =3D "Error parsing required = field 'required'!";=0A= }=0A= }=0A= }=0A= else if (typeof(theForm.elements["required"].value) !=3D = "undefined") {=0A= required_fields =3D = theForm.elements["required"].value.split(',');=0A= }=0A= else {=0A= // SHOULD NEVER HAPPEN=0A= warnings[warnings.length] =3D "Error parsing required field = 'required'!";=0A= }=0A= }=0A= else {=0A= // WARNING=0A= warnings[warnings.length] =3D "Missing required field 'required'!";=0A= }=0A= =0A= // Split element into individual field definitions=0A= for (i =3D 0; i < required_fields.length; i++) {=0A= // Get the definition of this form element=0A= var field_def =3D required_fields[i].split(':');=0A= =0A= // Get the field name and label=0A= for (j =3D 0; j < 8; j++) {=0A= if (typeof(field_def[j]) =3D=3D "undefined") { field_def[j] =3D = ''; }=0A= }=0A= var field_name =3D field_def[0];=0A= var field_desc =3D field_def[1];=0A= var field_type =3D field_def[2].toLowerCase();=0A= var is_valid =3D 0;=0A= =0A= // If the field exists, validate it=0A= if(typeof(theForm.elements[field_name]) =3D=3D "object") {=0A= // Get the rest of the field definition=0A= if (=0A= (field_type =3D=3D 'not_in') ||=0A= (field_type =3D=3D 'in') ||=0A= (field_type =3D=3D 'equal') ||=0A= (field_type =3D=3D 'eq') ||=0A= (field_type =3D=3D 'gt') ||=0A= (field_type =3D=3D 'gte') ||=0A= (field_type =3D=3D 'ge') ||=0A= (field_type =3D=3D 'lt') ||=0A= (field_type =3D=3D 'lte') ||=0A= (field_type =3D=3D'le')) {=0A= var list =3D field_def[3];=0A= var delim =3D field_def[4];=0A= }=0A= else {=0A= // Determine minimum/maximum field values (length for = strings)=0A= var minval =3D field_def[3];=0A= var maxval =3D field_def[4];=0A= if (isNaN(minval) || (minval < 0)) { minval =3D ""; }=0A= if (isNaN(maxval) || (maxval < 0)) { maxval =3D ""; }=0A= if (field_type =3D=3D 'numeric') {=0A= // Determine minimum and maximum digits after decimal = point=0A= var minprec =3D field_def[5];=0A= var maxprec =3D field_def[6];=0A= var optional =3D field_def[7];=0A= if (isNaN(minprec) || (minprec < 0)) { minprec =3D 0; }=0A= if (isNaN(maxprec) || (maxprec < 0)) { maxprec =3D ""; }=0A= }=0A= else {=0A= var minprec =3D 0;=0A= var maxprec =3D 0;=0A= var optional =3D field_def[5];=0A= }=0A= }=0A= =0A= // Determine reason code if field validation fails=0A= if ((field_type =3D=3D 'numeric') || (field_type =3D=3D 'integer')) {=0A= reason =3D 'must ';=0A= if ((minval) || (maxval)) {=0A= reason +=3D 'have a value of ';=0A= if (minval =3D=3D maxval) { reason +=3D minval; }=0A= else if ((minval) && (maxval)) { reason +=3D 'between ' + minval + ' = and ' + maxval; }=0A= else if ((!minval) && (maxval)) { reason +=3D maxval + ' or less'; }=0A= else if ((minval) && (!maxval)) { reason +=3D minval + ' or greater'; }=0A= }=0A= =0A= if (((minval) || (maxval))=0A= && ((minprec) || (maxprec))) { reason +=3D ' and '; }=0A= =0A= if ((minprec) || (maxprec)) {=0A= reason +=3D 'have ';=0A= if (!minprec) { minprec =3D 0; }=0A= if (minprec =3D=3D maxprec) { reason +=3D minprec; }=0A= else if ((minprec > 0) && (maxprec)) { reason +=3D 'between ' + = minprec + ' and ' + maxprec; }=0A= else if ((minprec <=3D 0) && (maxprec)) { reason +=3D 'up to ' + = maxprec; }=0A= else if ((minprec > 0) && (!maxprec)) { reason +=3D minprec + ' or = more'; }=0A= =0A= reason +=3D ' digits after the decimal point';=0A= }=0A= }=0A= else if (field_type =3D=3D 'not_in') {=0A= reason =3D 'supplied is reserved or in use';=0A= }=0A= else if (field_type =3D=3D 'in') {=0A= reason =3D 'supplied is invalid or not available';=0A= }=0A= else if ((field_type =3D=3D 'equal') || (field_type =3D=3D 'eq')) {=0A= reason =3D 'fields must match';=0A= }=0A= else if ((field_type =3D=3D 'lt') || (field_type =3D=3D 'gt')=0A= || (field_type =3D=3D 'gte') || (field_type =3D=3D 'ge')=0A= || (field_type =3D=3D 'lte') || (field_type =3D=3D 'le')) {=0A= reason =3D delim;=0A= }=0A= else if (field_type =3D=3D 'checkbox_group') {=0A= reason =3D '(please select at least one)';=0A= }=0A= else if (field_type =3D=3D 'option_group') {=0A= reason =3D '(please select one)';=0A= }=0A= else if (field_type =3D=3D 'date') {=0A= reason =3D 'does not make sense to me';=0A= }=0A= else {=0A= reason =3D 'must be';=0A= if (field_type =3D=3D 'url') {=0A= reason +=3D ' a valid URL';=0A= }=0A= else if (field_type =3D=3D 'alnum') {=0A= reason +=3D ' an alphanumeric string';=0A= }=0A= else if (field_type =3D=3D 'email') {=0A= reason +=3D ' a valid email address';=0A= }=0A= if ((minval) || (maxval)) {=0A= if (reason.length > 8) { reason +=3D ' and'; }=0A= if (minval =3D=3D maxval) { reason +=3D minval; }=0A= else if ((minval > 0) && (maxval)) { reason +=3D ' between ' + minval=0A= + ' and ' + maxval + ' characters in length'; }=0A= else if ((minval =3D=3D 0) && (maxval)) { reason +=3D ' up to ' + = maxval +=0A= ' characters in length'; }=0A= else if ((minval =3D=3D 1) && (!maxval)) { reason +=3D ' non-empty'; }=0A= else if ((minval) && (!maxval)) { reason +=3D ' at least ' + minval + = ' characters in length'; }=0A= }=0A= }=0A= =0A= // Do the validation=0A= if (field_type =3D=3D 'url') {=0A= is_valid =3D validate_url(theForm, field_name, minval, = maxval);=0A= }=0A= else if (field_type =3D=3D 'alnum') {=0A= is_valid =3D validate_alnum(theForm, field_name, minval, = maxval);=0A= }=0A= else if (field_type =3D=3D 'email') {=0A= is_valid =3D validate_email(theForm, field_name, minval, = maxval);=0A= }=0A= else if (field_type =3D=3D 'date') {=0A= is_valid =3D validate_date(theForm, field_name, minval, = maxval);=0A= }=0A= else if (field_type =3D=3D 'checkbox_group') {=0A= is_valid =3D validate_checkbox_group(theForm, field_name);=0A= }=0A= else if (field_type =3D=3D 'option_group') {=0A= is_valid =3D validate_option_group(theForm, field_name);=0A= }=0A= else if (field_type =3D=3D 'numeric') {=0A= is_valid =3D validate_numeric(theForm, field_name,=0A= minval, maxval, minprec, maxprec, optional);=0A= }=0A= else if (field_type =3D=3D 'integer') {=0A= is_valid =3D validate_numeric(theForm, field_name,=0A= minval, maxval, 0, 0, optional);=0A= }=0A= else if ((field_type =3D=3D 'not_in') || (field_type =3D=3D = 'in')) {=0A= var rev =3D (field_type =3D=3D "not_in");=0A= if (delim.length < 1) { delim =3D ","; }=0A= is_valid =3D validate_list(theForm, field_name, list, delim, = rev);=0A= }=0A= else if ((field_type =3D=3D 'equal') || (field_type =3D=3D = 'eq')) {=0A= is_valid =3D validate_equal(theForm, field_name, list);=0A= }=0A= else if (field_type =3D=3D 'gt') {=0A= is_valid =3D validate_greater_than(theForm, field_name, = list);=0A= }=0A= else if (field_type =3D=3D 'lt') {=0A= is_valid =3D validate_smaller_than(theForm, field_name, = list);=0A= }=0A= else if ((field_type =3D=3D 'gte') || (field_type =3D=3D 'ge')) = {=0A= is_valid =3D validate_greater_or_equal(theForm, field_name, = list);=0A= }=0A= else if ((field_type =3D=3D 'lte') || (field_type =3D=3D 'le')) = {=0A= is_valid =3D validate_smaller_or_equal(theForm, field_name, = list);=0A= }=0A= else {=0A= // DEFAULT: normal string=0A= is_valid =3D validate_string(theForm, field_name, minval, = maxval);=0A= }=0A= =0A= // If warning was returned, push onto array of warnings=0A= if (typeof(is_valid) =3D=3D "string") {=0A= warnings[warnings.length] =3D is_valid;=0A= }=0A= // If element is invalid, push onto the array of bad fields =0A= else if (!is_valid) {=0A= if (!(bad_fields.length)) {=0A= var focus_field =3D field_name;=0A= }=0A= var badfield =3D field_desc + " " + reason;=0A= bad_fields[bad_fields.length] =3D badfield;=0A= }=0A= }=0A= // N.B. If we can't find the form element, generate warning=0A= else {=0A= // WARNING=0A= warnings[warnings.length] =3D "Missing required field '" + = field_name +=0A= "' of type " + field_type.toUpperCase();=0A= }=0A= =0A= }=0A= =0A= // Determine action to take=0A= if (warnings.length) {=0A= alert("The form could not be validated because:\n\n * " +=0A= warnings.join("\n * ") + "\n\nPlease check your code.");=0A= return(false);=0A= }=0A= else if (bad_fields.length) {=0A= // XXX THIS DOES NOT WORK FOR RADIOS/CHECKBOXES. NEEDS INVESTIGATION!=0A= // XXX kmj, 24.09.2001=0A= // theForm.elements[focus_field].focus();=0A= // window.scrollBy(-40, -30);=0A= alert("The following fields have not been entered correctly:\n\n = * " +=0A= bad_fields.join("\n * ") + "\n\nPlease check your entries = and try again.");=0A= return(false);=0A= }=0A= else {=0A= return(true);=0A= }=0A= }=0A= ------=_NextPart_000_0000_01C7A3A8.38991C20 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://optics.org/cws/js/lib/realmedia.js /*=0A= $Id: realmedia.js,v 1.1 2006/11/29 10:59:56 tsb Exp $=0A= */=0A= =0A= OAS_rn =3D '001234567890';=0A= OAS_rns =3D '1234567890';=0A= OAS_rn =3D new String (Math.random());=0A= OAS_rns =3D OAS_rn.substring (2, 11);=0A= =0A= var Realmedia =3D {=0A= =0A= OAS_NORMAL : = function(pos,OAS_url,OAS_sitepage,OAS_listpos,OAS_query) {=0A= =0A= document.write('');=0A= document.write('3D"[Advertisement]"');=0A= =0A= =0A= },=0A= =0A= OAS_SCRIPT : function(OAS_url,OAS_sitepage,OAS_listpos,OAS_query) {=0A= document.write('