From: Subject: Technology Requirements of Corporate Treasurers Today Date: Sun, 11 Nov 2007 20:24:13 -0500 MIME-Version: 1.0 Content-Type: multipart/related; type="text/html"; boundary="----=_NextPart_000_0000_01C824A0.D3561320" X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3198 This is a multi-part message in MIME format. ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: text/html; charset="utf-8" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/article/6977.cfm =EF=BB=BF Technology Requirements of Corporate Treasurers = Today

Technology Requirements of Corporate Treasurers Today
Chad = Wekelo,=20 Actualize=20 Consulting - 08 Nov 2007

Email This Article

recipient email:

=20

This article discusses the technology requirements of = corporate=20 treasurers today - how are they changing and what is driving = this?

First and foremost, treasurers are becoming more interested in having = a=20 'profitable' treasury by adding value to the business. The treasurer's = success=20 in integrating their role more deeply in the corporate management = infrastructure=20 has created significant new demands, and will continue to require = innovative=20 energetic change management for many years to come. This holds = especially true=20 for treasurers of companies with global exposure.

The source and use of cash has always been at the core of treasury=20 functionality. Due to the treasurer's quest to figure out what cash they = have=20 and what cash the business is going to need over some future period, = there have=20 been increases in the innovation and technology required to keep pace = with the=20 ever expanding complexity of instruments bought or sold by the companies = they=20 are charged with. Not to mention auditors and regulators who are not = afraid to=20 'require' new types of analysis or controls. The good news is that there = are=20 tools available that can meet many of these challenges if the approach = and=20 implementation are done prudently.

Of course, complexity comes in many forms. Some solutions try to = simplify=20 this by offering a 'good enough' result across everything, while others = focus on=20 specifics and cover front to back for a small functional area. The more = complex=20 the makeup of the balance sheet, the less likely a single solution will = fit the=20 bill to provide capabilities sufficient to drive profitability.

What Are the Technology Requirements of Corporate Treasurers = Today?

In a nutshell, a treasurer needs what all management needs, to manage = more=20 (risk, product analysis, lines of business, reports, integrations, etc.) = without=20 the luxury of an unlimited budget. The successful treasurer will be able = to=20 employ their limited resources in a way that allows for more analysis on = ways=20 for the company to be successful (investments, product pricing, = profitability=20 analysis, effective hedge management, business line funding, corporate = funding,=20 FX strategies, economic capital management, and maybe even M&A). To = do this,=20 the employees performing all the nuts and bolts work of treasury need to = find=20 more efficient ways to do their jobs. Namely, more and better = automation!=20 Automation allows for tighter integration of treasury across the company = and=20 consequently more quality input to business decisions ranging from = funding to=20 investments.

Technology investments for today's treasurer need to provide a large = amount=20 of information in a concise manner, as well as provide automation of = functions=20 that take the time of their staff. Not many treasurers would attest to a = spreadsheet based process report if they were not sure their staff spent = sufficient time reviewing. Conversely, a well-designed system and = process can=20 produce reports with high confidence and little verification required = each time=20 it is produced.

Some key areas that merit focus are:

As the balance sheet becomes more complex and global in exposure, the = shift=20 to more risk management related functionality will continue to increase. = The=20 industry is seeing innovation in the areas of hedge accounting, cash = management=20 solutions, and risk analytics. The increases in sophistication of = business=20 strategies make it hard for the treasurer to keep up with a spreadsheet. = Every=20 application treasurers consider needs to be applicable to the full range = of=20 products across the enterprise to avoid implementing a solution that is = yet=20 another spreadsheet 'added' to the results.

Drivers Behind Treasurer Requirements Today

Treasurers Role

Treasures are increasingly expected to help support line of business=20 decisions including asset/liability management, funding, liquidity, = investments,=20 M&A and hedge position management and accounting. The more = integrated=20 treasurers become in the value-added decisions the more budget they will = have=20 for treasury innovation.

Complexity

As companies globalise and are exposed to more complex products, the=20 requirement to calculate various metrics quickly has increased to = include value,=20 liquidity, credit, and hedge effectiveness. For example, as some = financial=20 companies added mortgage investments to their portfolios it became very=20 important to model more scenarios for clearer pictures of risk to = various events=20 on a daily basis. Given a single bond you can still get away with a = spreadsheet=20 as long as you monitor it daily.

Reporting

Reporting requirements are driving change in that reports are needed = for much=20 more than just reporting to external entities. The 'treasury reports' = are=20 becoming a primary decision support tool for investments, funding, and = the cost=20 benefit matrix for projects. Accounting/finance systems need to develop = decision=20 support information instead of just external reporting requirements.

The most significant requirement changes have probably been around = two key=20 factors, scope and speed:

Scope:

Speed:

Which Solutions Are Working and Which Aren't?

Larger companies that can afford to invest in troops of consultants = and=20 costly infrastructure will continue to get results with the solutions = that are=20 very broad in scope. In the treasury space, Oracle/Peoplesoft and SAP = solutions=20 get good traction and with the right resources results are generally in = line=20 with expectations. These solutions provide large organisations with = dispersed=20 locations a more integrated solution that operates well across multiple=20 locations and divisions. However, these solutions are less robust in = handling=20 complex financial instruments such as fixed income securities or = derivatives.=20 The business and accounting rules for these products are very = specialised and=20 tend to require solutions targeted specifically for this purpose. While = it would=20 be an ideal solution to use these applications to handle all = transactions due to=20 the integration across multiple business areas the gap in current = functionality=20 has caused most companies to look towards other solutions.

Due to the large number of financial restatements and increased = volatility in=20 the markets, systems handling the processing and accounting of a = company's=20 various derivative products have received more attention recently. = Treasurers=20 want a solution that will allow them flexibility to execute the = appropriate risk=20 management strategy without concern for the operational and accounting = impacts.=20 Additionally, they want a solution that will integrate with the other = systems=20 without adding significant costs.

Solutions that are not proving successful are ones that do not = provide=20 extensibility, transparency, or require too much infrastructure = development in=20 order to keep it running. Spreadsheet-driven solutions are prime = examples of=20 non-extensible solutions that have inordinate financial model risks, and = have=20 virtually no systematic control. Other problems are:

Any solution with poor process design or implementation will not = improve=20 scope or speed. That being said, it is important to focus on these areas = when=20 considering a solution. It is important to remember that a solution that = is=20 difficult (relative to company) to implement due to high complexity and = large=20 amounts of customisation typically has a much higher engine run costs = that does=20 not come down over time.

What Can We Expect to See in The Future?

I suspect there will always be a debate over whether it is better to = acquire=20 the single solution (high customisation and/or organisational change = costs) or=20 implement the best of breed solution (typically large impact automation = for=20 smaller specific area). There may be a day when there is a solution that = can=20 cost efficiently as well the following:

  1. Do all types of pre-transaction analytics.=20
  2. Capture all transaction types.=20
  3. Immediately discount risk and help in pricing/trading.=20
  4. Immediately demonstrate impacts on financial statements and = economic=20 capital (pre and post trade).=20
  5. Seamlessly integrate with market information.=20
  6. Comply with FAS/IAS accounting standards.=20
  7. Is scalable to any type of business or process across the globe.=20
  8. Doesn't require customisation.=20
  9. Integrates with ERP/ERM systems.

Even if such a solution existed there is little doubt that it would = not be=20 long before new financial instruments would be created causing the use = of=20 spreadsheets or additions of 'best of breed' applications that solve = product=20 nuances better.

Predictions

  • STP will continue to improve and a more developed market for = payments will=20 further enhance the ability to streamline from pre-trade through = maturity=20 across more products (still a lot of work to do).=20
  • Decision support analytics will be done closer and closer to = transactions=20 and be tied immediately to reporting capabilities to illustrate how = decisions=20 will affect position performance, financial reporting, accounting, and = enterprise risk.=20
  • Excellence in scalability will continue to develop as evidenced by = increasing numbers of solutions that are built around ASP or are = web-based.=20 This removes a tremendous amount of program risk but may hamper = competitive=20 advantages if not done prudently. The bottom line is that scalability = sells.=20
  • Treasurers will get better market intelligence about their balance = sheet=20 to support better business decisions. Product pricing, investments, = funding,=20 and line of business (LOB) activities will all become better = integrated into=20 technology platforms.
gtnews - www.gtnews.com - =C2=A92007 - Terms = &=20 Conditions - Privacy policy
------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: image/gif Content-Transfer-Encoding: base64 Content-Location: http://www.gtnews.com/general/images/articlelogo.gif R0lGODlhfQAlAOYAAP////f39+7z++rz/+/v7+Tu/t/o++bm5tnh8Nvg5t7e383d/NHY39bW1sLW /srQ3sfP4MzMzLPK+KTL/8XFxpnM/7/Cy729vrS72ai865a9/5277bW1tny+/5a2+JK2/6mwwqys rX+04Yyq7W2v/4Oo96Wlpnut1pikwo2l1Wyq6GCl/3Se5ZmZmWyZ+IKWxmaZ/4yUsVac8liP/ouL jUmU/2CM64aGiISEhVOI4kGL/kqF/XOAo0qC935+gDOG/2F/w3p6e0J95z19/Tx79nZ2eWF0vXJy cyp5/yV5+WxsbiFz/05qri9r7GZmZhRr/0RhxSFo5l5eYBll7hFj/05chgdk/wBm/yFg2Bpf50Ba nC9bvUBUhhFZ2QlZ7gJZ/zNRnBdU3ABS9gBR/wFN7hZLxwBK9wBJ5R9EngBF3QBD6ABD1gtAugJB zSU/ewA59gA7xAA52QA15BE2jwA3tQA2vwAzzAAzrAAzmRQwdAArlQApjQAmggIeYgAAAAAAACH5 BAQUAP8ALAAAAAB9ACUAAAf/gACCg4SFhoeIiYqLjI2Oj5CRkpOUlZaXmJmam5ydnp+goaKjhQYf M0tLRC4SpK6vhBKoVF+1tVREJQawvJ8OQ1RUS0hIS0+0tWNiLgG9zpglwjor1DU/SMdWZlhTZk27 z+GRLlQ/Kx3oJDU62E9eLwQzZmZhC+L3jNE/JBX9HSvWjFmJImjHmDFkwhTAx9CQAypIzokQoQJg kilevJDp0oyIHDlx7EBpSFIQEio6ZKRgQICAiBwQYsZkIAgBhAc4HwwioCBCCAUAFJgwEaEQAQ4t WoQ4EJTDBQrNBB0oOigCUEEXWtAw0SBRAKQtODAddCBE0hAEyCqgEALA17BR/5GiPSRB2I8TggpM MABB0AQNgAVJ+EDYg4cUgigEkSKFwgXGjC9UdaKEQoQijQk8liJZUAspaQU1drvYRIgiPhAdOOIk wmYKWKVUvuwENgATThgfWMyYRgDeUoKEJjTDypImCQAY+PEkiQAAA6wc9NJsyJs3akLe6etWiRQa NA4EwBFcEIHcYwlIcdLMxPdB3jkIUgAaAAcpbaUiWkz1s5QAB+hmHmNXPaYEDlDdF1wIATSQmwml LGHFE0II8sGEX2wA3RO1ZNHMDmaQcUYabdDxwiCLsSfIfUXE5sQFMCrYVQSyNdMAY0FgdYQg7hUx FiL0STHWARRA5V6Og9wgRf8LgtyI34BSpCbIYlIOokEwVuQgCAxXXPEFCxt2+OE8Z6xRIhMoSgFh bEi650RSSQ0F1HlSAAXeYnYyCYCTTjCIyGNODJfke4N8hiSNQpqXW2cA+BBlITDYoiUANXwhHZgD cPiFhwD0oMaIa8BxBxhpMvpYm7IloqR8TpS1JABHMEpBblIc0ZUhCgoqiKM0EPLZEc3QqCIAdN7a 6KPE2VIhADOM8cUYmCLDqadqmFnHqKUOcqogIRCIyH0tRKBEULIdoMSPxLq3nq4AbGbsIOT1WqgU LQIgbFTFDuJolVvaMkUzJIxxhRmIDUDFQdOqQSIcdOBB6pScaVvenoytaQj/fUcEseZiNCBZiIOj AXBAaEFaPC+/NEhxgyDChpbvrsgO8oEtZrRigBdqdJGWwQg3k4MddsAhqh5aZMtmmlJQZYh3idrH mJ5uEZIybN0qcRV5TlxV1XpRwRqxvesqKoWx+xaywBQHjbHEQgdgQIA9BpNpDwJAAMFGw3vEMMgR X7ebqlR8L1mkCcOlXKV6fWvVAJG1NoOZFPKJHLgJFHAQ+Wc0EBCAezhEhajLjCmNWb2E9CBG2k98 sMACMGhpMBlkqBGFBM8VwMYdevChE480GNvAVoQEEIIPTjgRRAtd/640ACGEN4hiShxxBOEsF3HD cASYEETxRUTerg844BAE5gddK0AD8oIEkNSPZuVHyAZkiCH/PPO8YQMABeB8xhlxxFFGGbfDwx7c UJJJdC0TAQgD7OTHQDkgxgFqUNgaQlUHOtwBd3wAQQEZkoE29O+DcdhCWmwQhwm2QWgWxCAXNtiQ mTDghTQBwAji0IYTMsyCeNDDHvKALhaKwwAZkIAQJcACLAANhSnUQ+7ysDsfMsQId6iDFKdYwRTm MHduiKETGwICNODhgmC8oBJzxwcesGuL9wgACrQwhz240Y184IMbeKBFNG7QAjxwQx/6kIcqxOCM dgykIAdJyEIa8pCITKQiKREIADs= ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/stylesheet/print.css BODY { FONT-SIZE: 10pt; BACKGROUND: white } #focus { DISPLAY: none } #toc { DISPLAY: none } #anchors { DISPLAY: none } A:link { COLOR: #000000 } A:visited { COLOR: #000000 } P A:link { BACKGROUND: none transparent scroll repeat 0% 0%; FONT-STYLE: italic; = TEXT-DECORATION: underline } A:visited { BACKGROUND: none transparent scroll repeat 0% 0%; FONT-STYLE: italic; = TEXT-DECORATION: underline } P A:link:unknown { FONT-SIZE: 90%; content: " (" attr(href) ") " } #content A:visited:unknown { FONT-SIZE: 90%; content: " (" attr(href) ") " } P A[href^=3D'/']:unknown { content: " (http://www.gtnews.com" attr(href) ") " } ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/stylesheet/content.css BODY { FONT-SIZE: 80%; MARGIN: 10px 20px; FONT-FAMILY: Arial, Helvetica, = sans-serif; BACKGROUND-COLOR: #ffffff } A:link { COLOR: #0000cc; TEXT-DECORATION: none } A:hover { TEXT-DECORATION: underline } A:active { TEXT-DECORATION: underline } A:visited { COLOR: #555555; TEXT-DECORATION: none } A:hover:visited { TEXT-DECORATION: underline } EM { FONT-STYLE: italic } STRONG { FONT-WEIGHT: bold } UL { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; PADDING-BOTTOM: 0em; MARGIN: = 0.5em 1em 0.8em 2em; PADDING-TOP: 0em; LIST-STYLE-TYPE: disc } OL { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; PADDING-BOTTOM: 0em; MARGIN: = 0.5em 1em 0.8em 2em; PADDING-TOP: 0em; LIST-STYLE-TYPE: decimal } OL.alpha { LIST-STYLE-TYPE: lower-alpha } LI { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; LIST-STYLE-POSITION: outside; = FONT-SIZE: 1em; MARGIN-BOTTOM: 0.5em; PADDING-BOTTOM: 0em; MARGIN-RIGHT: = 1em; PADDING-TOP: 0em } P { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; FONT-SIZE: 1em; PADDING-BOTTOM: = 0em; MARGIN: 0em 0em 0.85em; PADDING-TOP: 0em } SUP { FONT-SIZE: 0.8em; VERTICAL-ALIGN: super } H2 { PADDING-RIGHT: 0em; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 0em; = FONT-SIZE: 1.2em; PADDING-BOTTOM: 0.3em; MARGIN: 0.1em 0em 0.5em; = PADDING-TOP: 0.3em; BORDER-BOTTOM: #cccccc 3px double } H3 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: bold; FONT-SIZE: = 1.15em; PADDING-BOTTOM: 5px; MARGIN: 0px; COLOR: #333333; PADDING-TOP: = 0px } H4 { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; FONT-WEIGHT: bold; FONT-SIZE: = 1.1em; PADDING-BOTTOM: 0em; MARGIN: 0em 0em 0.4em; PADDING-TOP: 0em } H5 { PADDING-RIGHT: 0em; PADDING-LEFT: 0em; FONT-WEIGHT: normal; FONT-SIZE: = 1.05em; PADDING-BOTTOM: 0em; MARGIN: 0em 0em 0.1em; COLOR: #000000; = PADDING-TOP: 0em; FONT-STYLE: italic } H6 { PADDING-RIGHT: 5px; BORDER-TOP: #999999 3px double; PADDING-LEFT: 0px; = FONT-WEIGHT: normal; FONT-SIZE: 0.85em; PADDING-BOTTOM: 0px; MARGIN: = 10px 0px 5px; PADDING-TOP: 5px; TEXT-ALIGN: right } CITE { FONT-WEIGHT: normal; FONT-SIZE: 0.95em; COLOR: #000000; FONT-STYLE: = normal } DIV { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 10px; MARGIN: = 0px; PADDING-TOP: 0px } DIV.fig { TEXT-ALIGN: center } DIV DFN { PADDING-RIGHT: 0px; DISPLAY: block! important; PADDING-LEFT: 0px; = FONT-WEIGHT: normal; PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: #333333; = PADDING-TOP: 5px; FONT-STYLE: italic } DIV TABLE { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; = BORDER-LEFT: #999999 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 = 1px solid; BORDER-COLLAPSE: collapse } DIV TABLE TR TH { PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: 0px; COLOR: #333333; = PADDING-TOP: 3px; BACKGROUND-COLOR: #eeeeee; TEXT-ALIGN: left } DIV TABLE TR TD { PADDING-RIGHT: 3px; PADDING-LEFT: 3px; PADDING-BOTTOM: 3px; MARGIN: = 0px; PADDING-TOP: 3px } DIV IMG { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 5px; PADDING-TOP: 0px } DIV.box { BORDER-RIGHT: #999999 3px double; PADDING-RIGHT: 15px; BORDER-TOP: = #999999 3px double; PADDING-LEFT: 15px; PADDING-BOTTOM: 5px; MARGIN: = 15px; BORDER-LEFT: #999999 3px double; LINE-HEIGHT: 1.2em; PADDING-TOP: = 12px; BORDER-BOTTOM: #999999 3px double } DIV.box H4 { FONT-STYLE: italic } DIV#feature { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } HR { BORDER-TOP-STYLE: dotted; BORDER-TOP-COLOR: #999999 } DIV.footnote { PADDING-RIGHT: 0px; BORDER-TOP: #666666 1px dotted; PADDING-LEFT: 10px; = PADDING-BOTTOM: 10px; MARGIN: 0px; PADDING-TOP: 10px } DIV.footnote P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: = 0.95em; PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; FONT-STYLE: = italic } DIV.footnote P SUP { FONT-SIZE: 1em; VERTICAL-ALIGN: super } ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: text/css; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/stylesheet/content+.css FORM { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } BLOCKQUOTE { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: normal; = FONT-SIZE: 1em; PADDING-BOTTOM: 5px; MARGIN: 0px; LINE-HEIGHT: 1.1em; = PADDING-TOP: 5px; FONT-STYLE: normal } .formbox { BORDER-RIGHT: #3399cc 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #3399cc 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; = BORDER-LEFT: #3399cc 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: = #3399cc 1px solid; TEXT-ALIGN: center } .banner { BORDER-RIGHT: #999999 1px solid; BORDER-TOP: #999999 1px solid; = MARGIN-TOP: 2px; MARGIN-BOTTOM: 2px; BORDER-LEFT: #999999 1px solid; = BORDER-BOTTOM: #999999 1px solid } .header { PADDING-RIGHT: 0px; BORDER-TOP: #666666 2px solid; PADDING-LEFT: 0px; = PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 0px; BORDER-BOTTOM: = #666666 2px solid; BACKGROUND-COLOR: #ffffff } P.summary { FONT-SIZE: 1.1em; MARGIN: 0.5em 0em 0.85em; COLOR: #222222; = LINE-HEIGHT: 1.2em; FONT-STYLE: italic } H3.summary { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 1em = 0em 0em; COLOR: #000000; PADDING-TOP: 0px; FONT-STYLE: normal } H3.summary IMG { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 2px = 7px 5px 0px; PADDING-TOP: 0px } DIV TABLE TR TH.acenter { TEXT-ALIGN: center } DIV IMG { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 5px; PADDING-TOP: 0px } .credit { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 7px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 7px; FONT-SIZE: 0.9em; PADDING-BOTTOM: = 7px; MARGIN: 5px 5px 5px 10px; BORDER-LEFT: #999999 1px solid; = LINE-HEIGHT: 14px; PADDING-TOP: 7px; BORDER-BOTTOM: #999999 1px solid } .credit TABLE { BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: = 0px; BORDER-RIGHT-WIDTH: 0px } DIV.box { BORDER-RIGHT: #999999 3px double; PADDING-RIGHT: 15px; BORDER-TOP: = #999999 3px double; PADDING-LEFT: 15px; PADDING-BOTTOM: 5px; MARGIN: = 15px; BORDER-LEFT: #999999 3px double; LINE-HEIGHT: 1.2em; PADDING-TOP: = 12px; BORDER-BOTTOM: #999999 3px double } DIV.box H4 { FONT-STYLE: italic } TABLE#featuretop TR TD { BORDER-TOP: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid } TABLE#featuretop TR TD IMG.banner { BORDER-RIGHT: #333333 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #333333 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 4px; = BORDER-LEFT: #333333 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #333333 = 1px solid } DIV#feature { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; PADDING-TOP: 0px } TABLE#poll { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } TABLE#poll DIV { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 10px; FONT-WEIGHT: normal; = PADDING-BOTTOM: 10px; MARGIN: 0px 3px 10px 25px; BORDER-LEFT: #999999 = 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #999999 1px solid; = FONT-STYLE: normal } TABLE#poll TEXTAREA { WIDTH: 200px } TABLE#poll LABEL { FONT-WEIGHT: normal; FONT-STYLE: normal } TABLE#poll H4 { PADDING-RIGHT: 4px; PADDING-LEFT: 10px; FONT-WEIGHT: bold; = PADDING-BOTTOM: 4px; MARGIN: 0px 3px 0px 25px; COLOR: #ffffff; = PADDING-TOP: 4px; FONT-STYLE: normal; BACKGROUND-COLOR: #888888 } DIV#feature TABLE.noborder { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } DIV#feature TABLE.noborder TABLE { BORDER-TOP-STYLE: none; BORDER-RIGHT-STYLE: none; BORDER-LEFT-STYLE: = none; BORDER-BOTTOM-STYLE: none } DIV#feature TR.question TD { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: bold; = PADDING-BOTTOM: 2px; MARGIN: 0px; VERTICAL-ALIGN: top; PADDING-TOP: 10px } DIV#feature TR.input TD { PADDING-RIGHT: 10px; PADDING-LEFT: 10px; FONT-WEIGHT: normal; = PADDING-BOTTOM: 3px; MARGIN: 0px; VERTICAL-ALIGN: top; PADDING-TOP: 2px } DIV#feature TR.question TD EM { FONT-WEIGHT: normal; FONT-STYLE: italic } DIV#feature TR.input INPUT.text { WIDTH: 300px } DIV#feature INPUT#submit { FONT-WEIGHT: bold; FONT-SIZE: 1em; COLOR: #0000ff; TEXT-DECORATION: = underline } DIV#feature DIV#message { FONT-WEIGHT: bold; FONT-SIZE: 1.1em; COLOR: #333333 } LI IMG { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px = 5px 3px 0px; PADDING-TOP: 0px } IMG.photo { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 3px = 5px 3px 0px; PADDING-TOP: 0px } DIV#feature A { TEXT-DECORATION: underline } TABLE#toc A { TEXT-DECORATION: underline } DIV#feature TABLE#survey { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } DIV#feature TABLE#survey TABLE { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } DIV#feature TABLE#survey TR TD H5 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1.3em; = PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-TOP: 15px } DIV#feature TABLE#survey TH { PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dotted; PADDING-LEFT: 0px; = FONT-WEIGHT: bold; FONT-SIZE: 1.1em; PADDING-BOTTOM: 5px; MARGIN: 0px; = VERTICAL-ALIGN: top; COLOR: #000000; PADDING-TOP: 7px; BACKGROUND-COLOR: = #ffffff; TEXT-ALIGN: left } DIV#feature TABLE#survey TR TH.surveysub { BORDER-TOP: #666666 2px solid } DIV#feature TABLE#survey TD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 1em; PADDING-BOTTOM: = 10px; MARGIN: 0px; PADDING-TOP: 3px } DIV#feature TABLE#survey TD TABLE TD { PADDING-RIGHT: 1px; PADDING-LEFT: 1px; PADDING-BOTTOM: 1px; MARGIN: = 0px; PADDING-TOP: 1px } DIV#feature TABLE#survey SELECT { FONT-WEIGHT: normal; FONT-SIZE: 11px; WIDTH: 250px } DIV#feature TABLE#survey SELECT.s100 { FONT-WEIGHT: normal; WIDTH: 100px } DIV#feature TABLE#survey SELECT.s150 { FONT-WEIGHT: normal; FONT-SIZE: 11px; WIDTH: 100px } DIV#feature TABLE#survey INPUT.text { FONT-WEIGHT: normal; WIDTH: 450px } DIV#feature TABLE#survey TEXTAREA { FONT-WEIGHT: normal; WIDTH: 450px } DIV#feature TABLE#survey INPUT.text200 { FONT-WEIGHT: normal; WIDTH: 200px } DIV#feature TABLE#survey TH EM { FONT-WEIGHT: normal; FONT-SIZE: 0.95em; FONT-STYLE: italic } DIV#feature TABLE#survey TH H4 { MARGIN-TOP: 5px; FONT-WEIGHT: bold; FONT-SIZE: 1em; COLOR: #333333 } TABLE#focus { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } TABLE#emailsend { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 2px 10px 15px; PADDING-TOP: 0px } TABLE#toc { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 2px 10px 15px; PADDING-TOP: 0px } TABLE#special { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 2px 10px 15px; PADDING-TOP: 0px } TABLE#emailsend TD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } TABLE#toc TD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } TABLE#special TD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; = PADDING-TOP: 5px } TABLE#emailsend TD { BACKGROUND-COLOR: #dbe5f4 } TABLE#special TD { BACKGROUND-COLOR: #dbe5f4 } TABLE#toc TD { PADDING-BOTTOM: 10px; BACKGROUND-COLOR: #eeeeee } TABLE#toc TABLE TD { PADDING-RIGHT: 5px; PADDING-LEFT: 5px; FONT-SIZE: 0.9em; = PADDING-BOTTOM: 2px; MARGIN: 0px; PADDING-TOP: 4px } TABLE#focus H4 { PADDING-RIGHT: 0px; PADDING-LEFT: 3px; FONT-WEIGHT: bold; FONT-SIZE: = 0.9em; PADDING-BOTTOM: 2px; MARGIN: 3px 0px 8px; TEXT-TRANSFORM: = uppercase; COLOR: #ffffff; PADDING-TOP: 2px; FONT-STYLE: normal } TABLE#emailsend H4 { BACKGROUND-COLOR: #93aacd } TABLE#special H4 { BACKGROUND-COLOR: #93aacd } TABLE#toc H4 { BACKGROUND-COLOR: #777777 } TABLE#focus INPUT.submit { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 3px; BORDER-TOP: = #999999 1px solid; MARGIN-TOP: 5px; PADDING-LEFT: 3px; FONT-SIZE: = 0.95em; MARGIN-BOTTOM: 5px; PADDING-BOTTOM: 3px; BORDER-LEFT: #999999 = 1px solid; PADDING-TOP: 3px; BORDER-BOTTOM: #999999 1px solid; = FONT-FAMILY: Arial, Helvetica, sans-serif; BACKGROUND-COLOR: #ffffff } TABLE#focus INPUT.text { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: = #999999 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 2px; FONT-SIZE: 11px; = MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 2px; BORDER-LEFT: #999999 1px solid; = WIDTH: 175px; PADDING-TOP: 2px; BORDER-BOTTOM: #999999 1px solid; = FONT-FAMILY: Arial, Helvetica, sans-serif; HEIGHT: 18px } TABLE#focus TEXTAREA { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 2px; BORDER-TOP: = #999999 1px solid; MARGIN-TOP: 2px; PADDING-LEFT: 2px; FONT-SIZE: 11px; = MARGIN-BOTTOM: 0px; PADDING-BOTTOM: 2px; BORDER-LEFT: #999999 1px solid; = WIDTH: 175px; PADDING-TOP: 2px; BORDER-BOTTOM: #999999 1px solid; = FONT-FAMILY: Arial, Helvetica, sans-serif; HEIGHT: 85px } TABLE#focus P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 0.9em; = PADDING-BOTTOM: 0px; MARGIN: 0px; COLOR: #000000; PADDING-TOP: 0px } SPAN#featurepart { FONT-WEIGHT: normal } TABLE#featuretoc { MARGIN: 0px 20px } TABLE#featuretoc TD { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 2px; = PADDING-TOP: 3px } TABLE#featuretoc TD STRONG { FONT-SIZE: 1em } TABLE#featuretoc TD IMG { MARGIN: 2px 8px 4px 0px } TABLE#wpdetail TD { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 0px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px; = BORDER-LEFT: #999999 1px solid; PADDING-TOP: 0px; BORDER-BOTTOM: #999999 = 1px solid; BORDER-COLLAPSE: collapse } TABLE#language A { FONT-WEIGHT: normal; FONT-SIZE: 0.9em; COLOR: #0000ff; TEXT-DECORATION: = underline } TABLE#language A IMG { BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; = BORDER-LEFT: #666666 1px solid; BORDER-BOTTOM: #666666 1px solid } DIV#privacy { BORDER-RIGHT: #cc0000 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: = #cc0000 1px solid; PADDING-LEFT: 10px; FONT-SIZE: 14px; PADDING-BOTTOM: = 10px; MARGIN: 20px; BORDER-LEFT: #cc0000 1px solid; WIDTH: 400px; = PADDING-TOP: 10px; BORDER-BOTTOM: #cc0000 1px solid } DIV.side { BORDER-RIGHT: #999999 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: = #999999 1px solid; PADDING-LEFT: 5px; FONT-SIZE: 0.9em; PADDING-BOTTOM: = 5px; BORDER-LEFT: #999999 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: = #999999 1px solid; BACKGROUND-COLOR: #eeeeee } DIV.side P { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: 0px = 0px 4px; PADDING-TOP: 0px } DIV.side P A { TEXT-DECORATION: underline } DIV.side TABLE { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; MARGIN: = 0px; BORDER-TOP-STYLE: none; PADDING-TOP: 0px; BORDER-RIGHT-STYLE: none; = BORDER-LEFT-STYLE: none; BORDER-BOTTOM-STYLE: none } ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/general/general.js function openbio(url){ winbio=3Dwindow.open(url,"enquirywin","status=3Dno,toolbar=3Dno,menubar=3D= yes,location=3Dno,directories=3Dno,resizable=3Dno,scrollbars=3Dyes,width=3D= 400,height=3D400") } function openpost(url){ winbio=3Dwindow.open(url,"postwin","status=3Dno,toolbar=3Dno,menubar=3Dye= s,location=3Dno,directories=3Dno,resizable=3Dno,scrollbars=3Dyes,width=3D= 600,height=3D600") } ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/CFIDE/scripts/cfform.js /* * Copyright (c) 1995-2005 Macromedia, Inc. All rights reserved.=20 */ // ColdFusion JavaScript functions for cfform client-side validation var _CF_error_messages =3D new Array(); var _CF_error_fields =3D new Object(); var _CF_FirstErrorField =3D null; var _CF_submit_status=3D new Array(); function _CF_signalLoad() { _CF_loaded =3D 1; } function _CF_onError(form_object, input_object, object_value, = error_message) { if( _CF_error_fields[input_object] =3D=3D null ) { if( _CF_FirstErrorField =3D=3D null ) { _CF_FirstErrorField =3D input_object; } _CF_error_exists =3D true; _CF_error_fields[input_object] =3D error_message; _CF_error_messages[_CF_error_messages.length ] =3D error_message; } } function _CF_onErrorAlert(msgArray) { //build error message string var errorStr =3D ""; for(var i=3D0; i < msgArray.length; i++) { errorStr +=3D msgArray[i] +"\n"; } =09 alert(errorStr); return false;=09 } /** * called by the flash controls in an html form, to update the right = hidden field */ function updateHiddenValue(val, form, name) { //alert(form +":" +name +":" +val); if (form =3D=3D null || form =3D=3D "") form =3D 0; if (document.forms[form] =3D=3D null || document.forms[form][name] = =3D=3D null) { return; } document.forms[form][name].value =3D val; } function _CF_hasValue(obj, obj_type, obj_trim) { =09 if (obj_type =3D=3D "TEXT" || obj_type =3D=3D "FILE" ||obj_type =3D=3D = "PASSWORD" || obj_type =3D=3D "CFTEXTAREA" || obj_type =3D=3D "TEXTAREA" = || obj_type =3D=3D "CFTEXTINPUT") { if (obj.value.length =3D=3D 0)=20 return false; else=20 if( obj_trim ) { //trim whitespace - for backward compatability this is optional str =3D obj.value.replace(/^\s+/,'').replace(/\s+$/,''); if (str.length =3D=3D 0) { return false; } } return true; } else if (obj_type =3D=3D "SELECT") { for (i=3D0; i < obj.length; i++) { if (obj.options[i].selected) return true; } return false;=09 } else if (obj_type =3D=3D "SINGLE_VALUE_RADIO" || obj_type =3D=3D = "SINGLE_VALUE_CHECKBOX") { if (obj.checked) return true; else return false;=09 } else if (obj_type =3D=3D "RADIO" || obj_type =3D=3D "CHECKBOX") { if( obj.length =3D=3D undefined && obj.checked ) { return true; }else{ for (i=3D0; i < obj.length; i++) { if (obj[i].checked) return true; } } return false;=09 }else if( obj_type =3D=3D "CFTREE"){ if( obj['value'].length > 0 ) { return true; }else{ return false; } }else{ return true; } } function _CF_checkdate(object_value, required) { //Returns true if value is a date format or is NULL //otherwise returns false //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); object_value =3D object_value =3D object_value.replace(/{d \'/, = '').replace(/'}/, ''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if (object_value.length =3D=3D 0) return true; //Returns true if value is a date in the mm/dd/yyyy format isplit =3D object_value.indexOf('/'); splitchr =3D "/"; if (isplit =3D=3D -1) { isplit =3D object_value.indexOf('.'); splitchr =3D "."; } if (isplit =3D=3D -1) { isplit =3D object_value.indexOf('-'); splitchr =3D "-"; } if (isplit =3D=3D -1 || isplit =3D=3D object_value.length) return false; var element1 =3D object_value.substring(0, isplit); // check for yyyy-mm-dd format if( element1.length =3D=3D 4 ) { sYear =3D object_value.substring(0, isplit); isplit =3D object_value.indexOf(splitchr, isplit + 1); if (isplit =3D=3D -1 || (isplit + 1 ) =3D=3D = object_value.length) return false; sMonth =3D object_value.substring((sYear.length + 1), isplit); sDay =3D object_value.substring(isplit + 1); } else { sMonth =3D object_value.substring(0, isplit); isplit =3D object_value.indexOf(splitchr, isplit + 1); if (isplit =3D=3D -1 || (isplit + 1 ) =3D=3D = object_value.length) return false; sDay =3D object_value.substring((sMonth.length + 1), isplit); sYear =3D object_value.substring(isplit + 1); } if (!_CF_checkinteger(sMonth)) //check month return false; else if (!_CF_checkrange(sMonth, 1, 12)) //check month return false; else if (!_CF_checkinteger(sYear)) //check year return false; else if( sYear.length !=3D 1 && sYear.length !=3D 2 && sYear.length = !=3D 4 ) return false; else if (!_CF_checkrange(sYear, 0, 9999)) //check year return false; else if (!_CF_checkinteger(sDay)) //check day return false; else if (!_CF_checkday(sYear, sMonth, sDay)) // check day return false; else return true; } function _CF_checkeurodate(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); object_value =3D object_value =3D object_value.replace(/{d \'/, = '').replace(/'}/, ''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } isplit =3D object_value.indexOf('/'); splitchr =3D "/"; if (isplit =3D=3D -1) { isplit =3D object_value.indexOf('.'); splitchr =3D "."; } =09 if (isplit =3D=3D -1) { isplit =3D object_value.indexOf('-'); splitchr =3D "-"; } if (isplit =3D=3D -1 || isplit =3D=3D object_value.length) return false; var element1 =3D object_value.substring(0, isplit); // check for yyyy-mm-dd format if( element1.length =3D=3D 4 ) { sYear =3D object_value.substring(0, isplit); isplit =3D object_value.indexOf(splitchr, isplit + 1); if (isplit =3D=3D -1 || (isplit + 1 ) =3D=3D = object_value.length) return false; sMonth =3D object_value.substring((sYear.length + 1), isplit); sDay =3D object_value.substring(isplit + 1); } else { sDay =3D object_value.substring(0, isplit); isplit =3D object_value.indexOf(splitchr, isplit + 1); if (isplit =3D=3D -1 || (isplit + 1 ) =3D=3D = object_value.length) return false; sMonth =3D object_value.substring((sDay.length + 1), isplit); sYear =3D object_value.substring(isplit + 1); } if (!_CF_checkinteger(sMonth)) return false; else if (!_CF_checkrange(sMonth, 1, 12)) return false; else if (!_CF_checkinteger(sYear)) return false; else if (!_CF_checkrange(sYear, 0, null)) return false; else if (!_CF_checkinteger(sDay)) return false; else if (!_CF_checkday(sYear, sMonth, sDay)) return false; else return true; } function _CF_checkday(checkYear, checkMonth, checkDay) { maxDay =3D 31; if (checkMonth =3D=3D 4 || checkMonth =3D=3D 6 || checkMonth =3D=3D 9 || checkMonth =3D=3D 11) maxDay =3D 30; else if (checkMonth =3D=3D 2) { if (checkYear % 4 > 0) maxDay =3D28; else if (checkYear % 100 =3D=3D 0 && checkYear % 400 > 0) maxDay =3D 28; else maxDay =3D 29; } return _CF_checkrange(checkDay, 1, maxDay); } function _CF_checkinteger(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); //remove numeric noise object_value =3D object_value.replace(/[$=C2=A3=C2=A5=E2=82=AC,~+]?/g, = ''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } var decimal_format =3D "."; var check_char =3D object_value.indexOf(decimal_format); if (check_char =3D=3D -1) return _CF_checknumber(object_value); else return false; } function _CF_numberrange(object_value, min_value, max_value, required) { //trim whitespace before we validate //object_value =3D = object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if (min_value !=3D null) { if (object_value < min_value) return false; } if (max_value !=3D null) { if (object_value > max_value) return false; } return true; } function _CF_checknumber(object_value, required) { var start_format =3D " .+-0123456789"; var number_format =3D " .0123456789"; var check_char; var decimal =3D false; var trailing_blank =3D false; var digits =3D false; //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); //remove numeric noise object_value =3D object_value.replace(/[$=C2=A3=C2=A5=E2=82=AC,~+]?/g, = ''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } check_char =3D start_format.indexOf(object_value.charAt(0)); if (check_char =3D=3D 1) decimal =3D true; else if (check_char < 1) return false; for (var i =3D 1; i < object_value.length; i++) { check_char =3D number_format.indexOf(object_value.charAt(i)); if (check_char < 0) return false; else if (check_char =3D=3D 1) { if (decimal) return false; else decimal =3D true; } else if (check_char =3D=3D 0) { if (decimal || digits)=09 trailing_blank =3D true; } else if (trailing_blank) return false; else digits =3D true; }=09 return true } function _CF_checkrange(object_value, min_value, max_value, required) { object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if (!_CF_checknumber(object_value)) return false; else return (_CF_numberrange((eval(object_value)), min_value, max_value)); return true; } function _CF_checktime(object_value, required) { object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); // replace the {t'..'} format around the timestamp if it exists object_value =3D object_value =3D object_value.replace(/{t \'/, = '').replace(/'}/, ''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } var result =3D _CF_checkregex(object_value, = /^(([0-1]?[0-9]|[2][1-4]):([0-5]?[0-9])(:[0-5]?[0-9])?).?([AP]M|[AP]m|[ap= ]m|[ap]M)?$/, required); return result; } /** * validate that the value is formatted as a telephone correctly * This pattern matches any US Telephone Number. * This regular expression excludes the first number, after the area = code,from being 0 or 1; * it also allows an extension to be added where it does not have to be = prefixed by 'x'. * * Matches:=20 * 617.219.2000=20 * 219-2000 * (617)283-3599 x234 * 1(222)333-4444 * 1 (222) 333-4444 * 222-333-4444 * 1-222-333-4444 * Non-Matches:=20 * 44-1344-458606 * +44-1344-458606 * +34-91-397-6611 * 7-095-940-2000 * +7-095-940-2000 * +49-(0)-889-748-5516 */ function _CF_checkphone(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if (object_value.length =3D=3D 0) return true; =09 return _CF_checkregex(object_value, /^(((1))?[ = ,\-,\.]?([\\(]?([1-9][0-9]{2})[\\)]?))?[ ,\-,\.]?([^0-1]){1}([0-9]){2}[ = ,\-,\.]?([0-9]){4}(( )((x){0,1}([0-9]){1,5}){0,1})?$/, required); } /** * validate that the value is formatted as a USA zipcode correctly * * This pattern will match any us zip code * matches: 12345, 12345-1234 */ function _CF_checkzip(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } return _CF_checkregex(object_value, /^([0-9]){5,5}$|(([0-9]){5,5}(-| = ){1}([0-9]){4,4}$)/, required); } function _CF_checkcreditcard(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if (object_value.length =3D=3D 0) return true; var white_space =3D " -"; var creditcard_string=3D""; var check_char; =09 for (var i =3D 0; i < object_value.length; i++) { check_char =3D white_space.indexOf(object_value.charAt(i)); if (check_char < 0) creditcard_string +=3D object_value.substring(i, (i + 1)); }=09 if (creditcard_string.length < 13 || creditcard_string.length > 19) return false; if (creditcard_string.charAt(0) =3D=3D "+") return false; if (!_CF_checkinteger(creditcard_string)) return false; var doubledigit =3D creditcard_string.length % 2 =3D=3D 1 ? false : = true; var checkdigit =3D 0; var tempdigit; for (var i =3D 0; i < creditcard_string.length; i++) { tempdigit =3D eval(creditcard_string.charAt(i)); if (doubledigit) { tempdigit *=3D 2; checkdigit +=3D (tempdigit % 10); if ((tempdigit / 10) >=3D 1.0) checkdigit++; doubledigit =3D false; } else { checkdigit +=3D tempdigit; doubledigit =3D true; } }=09 return (checkdigit % 10) =3D=3D 0 ? true : false; } /** * validate that the value is formatted as a SSN# correctly * * this Pattern that the SSN number matches the different formats. (X = =3D [0-9]) * matches: XXX-XX-XXXX, XXX XX XXXX,=20 * non-match: XXXXXXXXX */ function _CF_checkssn(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } return _CF_checkregex(object_value, /^[0-9]{3}(-| )[0-9]{2}(-| = )[0-9]{4}$/, required); } /** * validate that the value is formatted as an email address correctly * * this regex matches the majoriity of all email address. * example matches. * Matches: [rick.jones@unit.army.mil], [john_doe@foobar.com], = [foo99@foo.co.uk] =20 * Non-Matches: [find_the_mistake.@foo.org], [.prefix.@some.net] * * _CF_checkURL mailto uses this same email regex - keep in sync. */ function _CF_checkEmail(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } //return _CF_checkregex(object_value, = /^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$/); //return _CF_checkregex(object_value, = /^[a-zA-Z_0-9-]+(?:\.[a-zA-Z_0-9-]+)*@(?:[a-zA-Z_0-9-]+\.)+[a-zA-Z]{2,7}$= /); return _CF_checkregex(object_value, = /^[a-zA-Z_0-9-'\+~]+(\.[a-zA-Z_0-9-'\+~]+)*@([a-zA-Z_0-9-]+\.)+[a-zA-Z]{2= ,7}$/, required); } /** * validate that the value is formatted correctly for a http/https/ftp = url * This pattern will match http/https/ftp urls. * * Matches: http://www.mm.com/index.cfm * HTTP://WWW.MM.COM * http://www.mm.com/index.cfm?userid=3D1&name=3Dmike+nimer * http://www.mm.com/index.cfm/userid/1/name/mike+nimer - trick = used by cf developers so search engines can parse their sites (search = engines ignore query strings) * ftp://www.mm.com/ * ftp://uname:pass@www.mm.com/ * mailto:email@address.com * news:rec.gardening * news:rec.gardening * http://a/ * file://ftp.yoyodyne.com/pub/files/foobar.txt * Non-Matches: www.yahoo.com * http:www.mm.com * * _CF_checkEmail - the mailto email check is the same as the = _CF_checkEmail regex (keep in sync) */ function _CF_checkURL(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } //return _CF_checkregex(object_value.toLowerCase(), = /^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?[a-zA-Z0-9-\= .]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9-\._\?\,\'\/\+&%\$= #\=3D~])*)|((mailto)\:[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z0-9]{2,7})|= ((news)\:[a-zA-Z0-9\.]*)$/); return _CF_checkregex(object_value.toLowerCase(), = /^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?[a-zA-Z0-9-\= .]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9-\._\?\,\'\/\+&%\$= #\=3D~])*)|((mailto)\:[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+[= a-zA-Z0-9]{2,7})|((news)\:[a-zA-Z0-9\.]*)$/, required); } /** * A string UUID value is required. A UUID is a string * of length 35 formatted as XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX, where = X is a * hexadecimal digit (0-9 or A-F). */ function _CF_checkUUID(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } return _CF_checkregex(object_value, = /[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{16,16}/, = required); } /** * A string GUID value is required. A GUID is a string * of length 36 formatted as XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, where = X is a * hexadecimal digit (0-9 or A-F). */ function _CF_checkGUID(object_value, required) { //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } return _CF_checkregex(object_value, = /[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-F= a-f0-9]{12,12}/, required); } /** * checks CF boolean value * matches: true, false, 1, 0, yes, no */ function _CF_checkBoolean(object_value, required) {=09 //trim whitespace before we validate object_value =3D object_value.replace(/^\s+/,'').replace(/\s+$/,''); if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } if( object_value.toUpperCase() =3D=3D "TRUE" || = object_value.toUpperCase() =3D=3D "YES" || = (_CF_checknumber(object_value) && object_value !=3D "0") ) {=20 return true;=20 }else if( object_value.toUpperCase() =3D=3D "FALSE" || = object_value.toUpperCase() =3D=3D "NO" || object_value =3D=3D "0" ){ return true; }else{ return false; } } function _CF_setFormParam( strFormName, strParamName, strParamValue ) { var strObjName =3D "document['" + strFormName + "']['" + strParamName = +"']"; var obj =3D eval( strObjName ); if( obj =3D=3D undefined ) { return false; }else{ obj.value =3D strParamValue; return true; } } function _CF_checkregex(object_value, regexPattern, required) { if( required ) { if( object_value.length =3D=3D 0 ) { return false; } }else{ if( object_value.length =3D=3D 0 ) { return true; } } return regexPattern.test(object_value); } ------=_NextPart_000_0000_01C824A0.D3561320 Content-Type: application/octet-stream Content-Transfer-Encoding: quoted-printable Content-Location: http://www.gtnews.com/CFIDE/scripts/masks.js /* * Copyright (c) 1995-2005 Macromedia, Inc. All rights reserved.=20 */ var KT_focusedEl =3D null; /**********=20 KT_validateSingle function description: Validates single character agains single mask component params:=20 ascchar: character single character, to test if it is correct in the context of the = mask character=20 maskchar: character single mask character, see below for meaning returns:=20 boolean **********/ function KT_validateSingle(ascchar, maskchar) { var cchar =3D ascchar.charCodeAt(0); switch (maskchar) { case "9": //numeric if (cchar < 58 && cchar > 47) { return true; } break; case "A": //letter if ((cchar < 91 && cchar > 64) || (cchar < 123 && cchar > 96)) { return true; } break; case "X": //letter or numeric if ((cchar < 91 && cchar > 64) || (cchar < 123 && cchar > 96) || = (cchar < 58 && cchar > 47)) { return true; } break; case "?": //any character return true; break; default: return true; break; } } /**********=20 KT_maskDefaultValue function description: Called with a special mask character, returns the default value for = that type of mask params: maskchar: character single mask character, see below for meaning returns: character **********/ function KT_maskDefaultValue(maskchar) { switch (maskchar) { case "9": //numeric return '0'; break; case "A": //letter return 'a'; break; case "X": //letter or numeric return '0'; break; case "?": //any character return '0'; break; default: return '0'; break; } } /**********=20 KT_isSpecialChar function description: Checks if the parameter is a special mask character params: ascchar: character Special mask characters:=20 9 - numeric A - letters X - letter or number ? - any character returns: boolean **********/ function KT_isSpecialChar(ascchar) { if (ascchar =3D=3D '9' || ascchar =3D=3D 'A' || ascchar =3D=3D 'X' || = ascchar =3D=3D '?') { return true; } else { return false; } } /********** mask_onValueChanged function description: Called when=20 - the user types something in the input - the input loses the focus It validates the input's value against the input's mask params:=20 none returns: none **********/ function mask_onValueChanged() { if ((typeof window.getSelection =3D=3D 'undefined' && typeof = document.selection =3D=3D 'undefined')) { // if the current browser is not compatible, do nothing return; } =09 if (KT_focusedEl =3D=3D null || KT_focusedEl.mask =3D=3D null || = KT_focusedEl.mask =3D=3D '') { return; } var mask =3D KT_focusedEl.mask; var val =3D KT_focusedEl.value; var i =3D 0; var moveCursor =3D false; if (val =3D=3D KT_focusedEl.oldText) { // if the field content did not change since the last update, do = nothing return; } if (val.length > mask.length) { // strip trailing characters if text length is bigger than mask = length val =3D val.substr(0, mask.length); moveCursor =3D true; } for (; i < mask.length ; i++) { if (val.charCodeAt(i).toString() !=3D 'NaN') { //if the char is inserted if (KT_isSpecialChar(mask.charAt(i))) { if (KT_validateSingle(val.charAt(i), mask.charAt(i))) { //character is correct, go to next continue; } else { //revert to the last known good value, increase index to break = loop val =3D KT_focusedEl.oldText; i =3D mask.length; break; } } else { //normal character in the mask if (val.charAt(i) !=3D mask.charAt(i)) { //if the character is different from the mask if (i =3D=3D val.length - 1) { //append last character and move cursor to the end var lastChar =3D val.substr(val.length -1, val.length); val =3D val.substr(0, val.length -1) + mask.charAt(i) + lastChar; moveCursor =3D true; continue; } else { //revert to the last known good value, increase index to break = loop val =3D KT_focusedEl.oldText; i =3D mask.length; } break; } } } else { //if the current char is not inserted if (val.length < KT_focusedEl.oldText.length) { //deleted character break; } for (;i mask.length) { // strip trailing characters if text length is bigger than mask = length val =3D val.substr(0, mask.length); moveCursor =3D true; } if (KT_focusedEl.value !=3D val) { KT_focusedEl.value =3D val; //last calculated correct value } KT_focusedEl.oldText =3D val; //update so we can check on next = character if (moveCursor) { // no need to move the cursor, it is automatically moved at the end = of the sellection by IE and Mozilla } } /**********=20 mask_parseFirstTime function description: Called from mask_onSetFocus, only the first time ( when obj.mask is = undefined) Tries to parse the initial value into a valid format, with the = following algorithm: - normalizes the string adding non special mask characters if they do = not exist - it strips the mask of all non special characters - rebuilds the string using the stripped mask - compares the string with the stripped mask and changes the values = if they are invalid - rebuild the string and returns params: none returns: none **********/ function mask_parseFirstTime(value, mask) { var strippedmask =3D ''; var strippedvalue =3D ''; cond =3D 1;imask =3D 0; ival =3D 0;cnt =3D 0; //NORMALIZE VALUE: add non special characters while (cond =3D=3D 1) { cond =3D 1; if (!KT_isSpecialChar(mask.charAt(imask))) { if (value.charCodeAt(ival).toString() !=3D 'NaN') { if (mask.charAt(imask) =3D=3D value.charAt(ival)) { imask++;ival++; } else { value =3D value.substr(0, ival) + mask.charAt(imask) + = value.substr(ival, value.length); imask =3D 0; ival =3D 0; cond =3D 1; } } else { value +=3D KT_maskDefaultValue(mask.charAt(imask)); } } else { imask++;ival++; } if (imask >=3D mask.length || ival >=3D value.length) { cond =3D 0; } } //save only the special chars in a mask for (i=3D0;i