<!-- /*

* This application relies on the following open source projects:

*

* Prototype JavaScript framework, version 1.7

* (c) 2005-2010 Sam Stephenson

* See the Prototype web site: http://www.prototypejs.org/

*

* A Modified version of precise_round from

* http://phpjs.org/functions/round:505

*

* An elaboration upon the Python Standard Library's

* title method. The original can be viewed in the PSL-2.6.6 source.

*

* Some of the methods described by Douglas Crockford at Remedial JavaScript:

* http://javascript.crockford.com/remedial.html

*

* A port of Mika Tuupola's php script Google_Maps_Clusterer, avail. here:

* http://goo.gl/kteaC

*

* Array Remove - By John Resig (MIT Licensed)

*

*/ -->

<!docType html public><html><head><title>NTI Facilities Displayed with Google Maps</title><meta name="ROBOTS" content="NOINDEX, NOFOLLOW" /><!--[if IE]><style type="text/css"> #map_canvas{ height: 400px; width: 600px; } a.country{ margin-top: -2px !important; } </style><![endif]--><link rel="icon" href="http://www.nti.org/favicon.ico" type="image/x-icon" /><style type="text/css">*{padding:0;margin:0}body{margin:0;padding:0}#mapUI{margin:10px 0 0 10px;width:98%;height:98%;background:#006;position:absolute}#mapCanvas{position:absolute;top:30px;left:30px;bottom:195px;right:315px;font-family:verdana,arial,helvetica;font-size:.9em}#mapCanvas a,#mapCanvas a img{text-decoration:none;border:0}#mapCanvas #infoWindow #reopen{color:maroon}div.clumpContent{width:350px;min-height:200px}div.clumpContent img.insideIcon{height:24px;margin:0 4px 0 0;position:relative;top:6px;width:24px}div.clumpContent hr{margin:8px 0 0 0}#helpText,#aboutText{background-color:white;width:400px;position:absolute;z-index:-1;padding:2%}#helpText li,#aboutText p{margin:.5em}#mapKey{width:300px;position:absolute;top:25px;right:0;margin-top:0;font-family:Arial,Helvetica,sans-serif;font-size:14px}#mapKey a{text-decoration:none}#mapUI .instruct{position:relative;color:dodgerBlue;z-index:100;font-size:1.5em;font-weight:bold;left:-2px}#mapKey a.collapse,#mapKey img.collapse{position:relative;float:left;font:inherit;text-decoration:inherit;color:gray;clear:both;border:0;padding:0;margin:0;white-space:nowrap}#mapKey img.collapse{clear:left;float:left;margin:8px 2px 2px 0;width:32px;height:32px;padding:0}#mapKey a.parent{margin:10px 0 0 8px;padding:0;font-weight:bold;font-size:1.1em;width:120px;vertical-align:middle;clear:none;float:left;height:32px;line-height:24px}#mapKey span.orgtog{position:relative;float:left;clear:both;width:100%}#mapKey big{font-size:1.5em;position:relative;bottom:-.1em;right:0}#mapKey a.child{position:relative;display:block;white-space:nowrap;clear:none;line-height:30px;vertical-align:middle;height:30px;font-weight:bold;font-size:.9em;margin:0 0 0 5px;padding:0}#mapKey img.child{float:left;height:22px;width:22px;vertical-align:top;padding:2px 2px 2px 5px;margin:2px 2px 2px 10px;cursor:pointer}#mapKey div.children{display:none}#mapKey div.children br{float:left}#mapKey span.controller{display:block;white-space:nowrap}#mapFoot{padding:5px;width:75%;background:#ccc;clear:both;position:absolute;float:left;border:3px inset #ccc;left:30px}#mapFoot #countryMenu{clear:both;padding:0}#mapFoot #countryMenu a.country{height:17px;width:136px;position:relative;float:left;margin:0;padding:0;clear:none}#mapFoot #disclaimer{clear:none;float:left;color:navy;font-weight:bold;font-size:1.03em}#mapFoot #mapSharing{float:right;clear:none;color:IndianRed}#mapFoot #mapSharing a{color:#f21;font-weight:bold;font-size:.8em}#mapUI div.topLeft{width:18px;height:17px;background:white url(images/top_left.png) left 4px no-repeat;position:absolute;left:0;top:-4px;z-index:2;padding:0;margin:0}#mapUI div.topRight{width:31px;height:30px;background:white url(images/top_right.png) left top no-repeat;position:absolute;right:-8px;top:0;z-index:3}#mapUI div.midRight{width:8px;position:absolute;top:15px;bottom:31px;left:100%;height:99%;background:white url(images/right_shade.png) 0 top repeat-y;margin-left:0}#mapUI div.bottomLeft{width:24px;height:29px;background:white url(images/bottom_left.png) left bottom no-repeat;position:absolute;left:0;bottom:-8px;z-index:2}#mapUI div.bottomMiddle{height:7px;background:white url(images/bottom_shade.png) left 0 repeat-x;position:absolute;left:0;right:18px;bottom:-7px;z-index:2;padding:0000;width:100%;top:100%}#mapUI div.bottomRight{width:32px;height:31px;background:white url(images/bottom_right.png) right top no-repeat;position:absolute;right:-8px;bottom:-8px;z-index:4}#mapUI a.bottomRight:focus{border:1px orange solid}a.logo{border-color:navy;border-width:0;border:0;outline:none;text-decoration:none}img.logo{border-width:0;border:0;position:absolute;bottom:20px;right:20px;z-index:5}.instruct{left:8px}#mapFoot h5.slowness{clear:both;position:relative;top:3px;left:-3px;color:navy;padding:5px}#hidestuff{color:white;position:fixed;height:100%;width:100%;z-index:10000;background:navy;padding-left:10%;padding-right:10%;padding-top:5%}#hidestuff h4{top:100px;float:left;position:relative}#hidestuff img.loading{top:0;left:-120px;position:relative;float:left;height:220px;width:220px}#hidestuff p{position:relative;padding-top:1%;clear:both;width:80%}img.preload{display:none}img.cntrydown{width:139px;height:17px}</style><script src="http://www.google.com/jsapi?autoload=%7B%22modules%22%3A%5B%7B %22name%22%3A%22maps%22%2C%22version%22%3A%223.9%22%2C%22language%22%3A%22en%22%2C %22other_params%22%3A%22sensor=false%22%7D%5D%7D&key=ABQIAAAA3r492rrpim0Ux0p2RJ2 nzhT8Ni7XWYOg_ulja5YttW-a2JwW5BR78rAtsOza_wvQn2yCg0FMmjFIeQ"></script></head><body><div id="hidestuff"><h4> Preparing the requested map. </h4><img src="images/loading.gif" class="loading" /><p> The nuclear, chemical, biological, and missile facilities depicted in this map correspond to content found in the NTI country profiles. Please see this content for further information and sources. Since definitive information on countries' NBC and missile facilities is often classified, the descriptions and mapped locations of these facilities are sometimes speculative, based on the most credible available open source material. </p><br /><p> This material is produced independently for NTI by the James Martin Center for Nonproliferation Studies at the Monterey Institute of International Studies and does not necessarily reflect the opinions of and has not been independently verified by NTI or its directors, officers, employees, or agents. Copyright © 2011 by MIIS. </p><img src="images/nti_logo_white_170x74.png" class="logo" /></div><div id="mapUI"><div id="mapCanvas"></div><div id="mapKey"><span class="parent instruct">Show/hide facility type</span><div><span id="deck" class="controller active"><a id="deck" href="#" onclick="return false;" class="collapse" title=""><img src="images/clump_fanned.png" class="collapse active icon" /></a><a href="#" onclick="return false;" id="deck" class="collapse parent active" title="Show/hide all facilities." title="">Any Category</a></span></div><span id="biologicalController" class="controller active"><a id="biologicalAll" href="#" onclick="return false;" class="collapse active" title="Show/hide all biological facilities"><img src="images/biological.png" class="collapse icon active" /></a><a href="#" onclick="return false;" id="biologicalStem" class="collapse parent active" title="Show/hide list of biological facility types">Biological <big>►</big></a></span><div id="biologicalCollapse" class="children active"><span class="orgtog"><img src="images/biological.png" class="collapse icon child active" /><a id="biologicalInner" href="#" onclick="return false;" title="Show/hide all biological facilities." class="collapse child active">Show/hide all biological facilities</a></span><span class="orgtog"><img src="images/dual_bio.png" class="collapse icon child active" /><a id="biological_dual-use_infrastructure" href="#" onclick="return false;" title="Show/hide biological dual-use infrastructure facilities." class="collapse child active">Dual-Use Infrastructure</a></span><span class="orgtog"><img src="images/biological_education_training.png" class="collapse icon child active" /><a id="biological_education_and_training" href="#" onclick="return false;" title="Show/hide biological education and training facilities." class="collapse child active">Education and Training</a></span><span class="orgtog"><img src="images/biological_production.png" class="collapse icon child active" /><a id="biological_production" href="#" onclick="return false;" title="Show/hide biological production facilities." class="collapse child active">Production</a></span><span class="orgtog"><img src="images/biological_regulatory.png" class="collapse icon child active" /><a id="biological_regulatory" href="#" onclick="return false;" title="Show/hide biological regulatory facilities." class="collapse child active">Regulatory</a></span><span class="orgtog"><img src="images/biological_r_n_d.png" class="collapse icon child active" /><a id="biological_research_and_development" href="#" onclick="return false;" title="Show/hide biological research and development facilities." class="collapse child active">Research and Development</a></span><span class="orgtog"><img src="images/bio_test.png" class="collapse icon child active" /><a id="biological_testing" href="#" onclick="return false;" title="Show/hide biological testing facilities." class="collapse child active">Testing</a></span><span class="orgtog"><img src="images/biological_weaponization.png" class="collapse icon child active" /><a id="biological_weaponization" href="#" onclick="return false;" title="Show/hide biological weaponization facilities." class="collapse child active">Weaponization</a></span></div><span id="chemicalController" class="controller active"><a id="chemicalAll" href="#" onclick="return false;" class="collapse active" title="Show/hide all chemical facilities"><img src="images/chemical.png" class="collapse icon active" /></a><a href="#" onclick="return false;" id="chemicalStem" class="collapse parent active" title="Show/hide list of chemical facility types">Chemical <big>►</big></a></span><div id="chemicalCollapse" class="children active"><span class="orgtog"><img src="images/chemical.png" class="collapse icon child active" /><a id="chemicalInner" href="#" onclick="return false;" title="Show/hide all chemical facilities." class="collapse child active">Show/hide all chemical facilities</a></span><span class="orgtog"><img src="images/dual_chem.png" class="collapse icon child active" /><a id="chemical_dual-use_infrastructure" href="#" onclick="return false;" title="Show/hide chemical dual-use infrastructure facilities." class="collapse child active">Dual-Use Infrastructure</a></span><span class="orgtog"><img src="images/chemical_education_training.png" class="collapse icon child active" /><a id="chemical_education_and_training" href="#" onclick="return false;" title="Show/hide chemical education and training facilities." class="collapse child active">Education and Training</a></span><span class="orgtog"><img src="images/chem_org.png" class="collapse icon child active" /><a id="chemical_military_organizations" href="#" onclick="return false;" title="Show/hide chemical military organizations facilities." class="collapse child active">Military Organizations</a></span><span class="orgtog"><img src="images/chem_production.gif" class="collapse icon child active" /><a id="chemical_production" href="#" onclick="return false;" title="Show/hide chemical production facilities." class="collapse child active">Production</a></span><span class="orgtog"><img src="images/chemical_regulatory.png" class="collapse icon child active" /><a id="chemical_regulatory" href="#" onclick="return false;" title="Show/hide chemical regulatory facilities." class="collapse child active">Regulatory</a></span><span class="orgtog"><img src="images/chemical_r_n_d.png" class="collapse icon child active" /><a id="chemical_research_and_development" href="#" onclick="return false;" title="Show/hide chemical research and development facilities." class="collapse child active">Research and Development</a></span><span class="orgtog"><img src="images/chemical_storage.png" class="collapse icon child active" /><a id="chemical_storage" href="#" onclick="return false;" title="Show/hide chemical storage facilities." class="collapse child active">Storage</a></span></div><span id="missileController" class="controller active"><a id="missileAll" href="#" onclick="return false;" class="collapse active" title="Show/hide all missile facilities"><img src="images/missile.png" class="collapse icon active" /></a><a href="#" onclick="return false;" id="missileStem" class="collapse parent active" title="Show/hide list of missile facility types">Missile <big>►</big></a></span><div id="missileCollapse" class="children active"><span class="orgtog"><img src="images/missile.png" class="collapse icon child active" /><a id="missileInner" href="#" onclick="return false;" title="Show/hide all missile facilities." class="collapse child active">Show/hide all missile facilities</a></span><span class="orgtog"><img src="images/missile_acquisition.png" class="collapse icon child active" /><a id="missile_acquisition" href="#" onclick="return false;" title="Show/hide missile acquisition facilities." class="collapse child active">Acquisition</a></span><span class="orgtog"><img src="images/mis_launch_site.gif" class="collapse icon child active" /><a id="missile_base" href="#" onclick="return false;" title="Show/hide missile base facilities." class="collapse child active">Base</a></span><span class="orgtog"><img src="images/mis_design.gif" class="collapse icon child active" /><a id="missile_design" href="#" onclick="return false;" title="Show/hide missile design facilities." class="collapse child active">Design</a></span><span class="orgtog"><img src="images/missile_education.png" class="collapse icon child active" /><a id="missile_education_and_training" href="#" onclick="return false;" title="Show/hide missile education and training facilities." class="collapse child active">Education and Training</a></span><span class="orgtog"><img src="images/missile_shield.png" class="collapse icon child active" /><a id="missile_missile_defense" href="#" onclick="return false;" title="Show/hide missile missile defense facilities." class="collapse child active">Missile Defense</a></span><span class="orgtog"><img src="images/mis_production.gif" class="collapse icon child active" /><a id="missile_production" href="#" onclick="return false;" title="Show/hide missile production facilities." class="collapse child active">Production</a></span><span class="orgtog"><img src="images/missile_regulatory.png" class="collapse icon child active" /><a id="missile_regulatory" href="#" onclick="return false;" title="Show/hide missile regulatory facilities." class="collapse child active">Regulatory</a></span><span class="orgtog"><img src="images/missile_r_n_d.png" class="collapse icon child active" /><a id="missile_research_and_development" href="#" onclick="return false;" title="Show/hide missile research and development facilities." class="collapse child active">Research and Development</a></span><span class="orgtog"><img src="images/mis_telemetry.gif" class="collapse icon child active" /><a id="missile_telemetry" href="#" onclick="return false;" title="Show/hide missile telemetry facilities." class="collapse child active">Telemetry</a></span><span class="orgtog"><img src="images/mis_testing.gif" class="collapse icon child active" /><a id="missile_testing" href="#" onclick="return false;" title="Show/hide missile testing facilities." class="collapse child active">Testing</a></span></div><span id="nuclearController" class="controller active"><a id="nuclearAll" href="#" onclick="return false;" class="collapse active" title="Show/hide all nuclear facilities"><img src="images/nuclear.png" class="collapse icon active" /></a><a href="#" onclick="return false;" id="nuclearStem" class="collapse parent active" title="Show/hide list of nuclear facility types">Nuclear <big>►</big></a></span><div id="nuclearCollapse" class="children active"><span class="orgtog"><img src="images/nuclear.png" class="collapse icon child active" /><a id="nuclearInner" href="#" onclick="return false;" title="Show/hide all nuclear facilities." class="collapse child active">Show/hide all nuclear facilities</a></span><span class="orgtog"><img src="images/nuc_acquisition.gif" class="collapse icon child active" /><a id="nuclear_acquisition" href="#" onclick="return false;" title="Show/hide nuclear acquisition facilities." class="collapse child active">Acquisition</a></span><span class="orgtog"><img src="images/nuc_production.gif" class="collapse icon child active" /><a id="nuclear_component_production" href="#" onclick="return false;" title="Show/hide nuclear component production facilities." class="collapse child active">Component Production</a></span><span class="orgtog"><img src="images/nuclear_conversion.png" class="collapse icon child active" /><a id="nuclear_conversion" href="#" onclick="return false;" title="Show/hide nuclear conversion facilities." class="collapse child active">Conversion</a></span><span class="orgtog"><img src="images/nuclear_education.png" class="collapse icon child active" /><a id="nuclear_education_and_training" href="#" onclick="return false;" title="Show/hide nuclear education and training facilities." class="collapse child active">Education and Training</a></span><span class="orgtog"><img src="images/nuc_enrichment.gif" class="collapse icon child active" /><a id="nuclear_enrichment" href="#" onclick="return false;" title="Show/hide nuclear enrichment facilities." class="collapse child active">Enrichment</a></span><span class="orgtog"><img src="images/nuclear_mining.png" class="collapse icon child active" /><a id="nuclear_exploration_and_mining" href="#" onclick="return false;" title="Show/hide nuclear exploration and mining facilities." class="collapse child active">Exploration and Mining</a></span><span class="orgtog"><img src="images/nuclear_fabricate.png" class="collapse icon child active" /><a id="nuclear_fuel_fabrication" href="#" onclick="return false;" title="Show/hide nuclear fuel fabrication facilities." class="collapse child active">Fuel Fabrication</a></span><span class="orgtog"><img src="images/nuc_heavy_water.png" class="collapse icon child active" /><a id="nuclear_heavy_water_production" href="#" onclick="return false;" title="Show/hide nuclear heavy water production facilities." class="collapse child active">Heavy Water Production</a></span><span class="orgtog"><img src="images/nuc_med.png" class="collapse icon child active" /><a id="nuclear_medical_isotope_production" href="#" onclick="return false;" title="Show/hide nuclear medical isotope production facilities." class="collapse child active">Medical Isotope Production</a></span><span class="orgtog"><img src="images/nuclear_milling.png" class="collapse icon child active" /><a id="nuclear_milling" href="#" onclick="return false;" title="Show/hide nuclear milling facilities." class="collapse child active">Milling</a></span><span class="orgtog"><img src="images/nuc_plutonium_reactors.gif" class="collapse icon child active" /><a id="nuclear_plutonium_production_reactor" href="#" onclick="return false;" title="Show/hide nuclear plutonium production reactor facilities." class="collapse child active">Plutonium Production Reactor</a></span><span class="orgtog"><img src="images/powerReactor.png" class="collapse icon child active" /><a id="nuclear_power_reactor" href="#" onclick="return false;" title="Show/hide nuclear power reactor facilities." class="collapse child active">Power Reactor</a></span><span class="orgtog"><img src="images/nuclear_regulation.png" class="collapse icon child active" /><a id="nuclear_regulatory" href="#" onclick="return false;" title="Show/hide nuclear regulatory facilities." class="collapse child active">Regulatory</a></span><span class="orgtog"><img src="images/nuc_reprocessing.gif" class="collapse icon child active" /><a id="nuclear_reprocessing" href="#" onclick="return false;" title="Show/hide nuclear reprocessing facilities." class="collapse child active">Reprocessing</a></span><span class="orgtog"><img src="images/nuclear_development.png" class="collapse icon child active" /><a id="nuclear_research_and_development" href="#" onclick="return false;" title="Show/hide nuclear research and development facilities." class="collapse child active">Research and Development</a></span><span class="orgtog"><img src="images/nuclear_researchReactor.png" class="collapse icon child active" /><a id="nuclear_research_reactors" href="#" onclick="return false;" title="Show/hide nuclear research reactors facilities." class="collapse child active">Research Reactors</a></span><span class="orgtog"><img src="images/nukeStorage.png" class="collapse icon child active" /><a id="nuclear_storage" href="#" onclick="return false;" title="Show/hide nuclear storage facilities." class="collapse child active">Storage</a></span><span class="orgtog"><img src="images/nuc_testing.gif" class="collapse icon child active" /><a id="nuclear_testing" href="#" onclick="return false;" title="Show/hide nuclear testing facilities." class="collapse child active">Testing</a></span><span class="orgtog"><img src="images/nuclear_waste.png" class="collapse icon child active" /><a id="nuclear_waste_management" href="#" onclick="return false;" title="Show/hide nuclear waste management facilities." class="collapse child active">Waste Management</a></span><span class="orgtog"><img src="images/nuclear_weapon.png" class="collapse icon child active" /><a id="nuclear_weaponization" href="#" onclick="return false;" title="Show/hide nuclear weaponization facilities." class="collapse child active">Weaponization</a></span></div></div><div id="helpText"><a href="#" onclick="return false;" class="hide">Hide</a><ul><li> To jump quickly to another country, click a country name below (e.g., <a href="#" onclick="return false;" id="see_nk">North Korea</a>). </li><li> Click on a category name (e.g., <a href="#" onclick="return false;" id="show_chem">chemical</a> ) to list all of that category's facilities in the current map area, along with the number of facilities displayed. This list will change dynamically as you move around the map. </li><li> Click on a facility type (e.g., <a href="#" onclick="return false;" id="show_production">Production</a>) to SHOW/HIDE its place marks. </li><li> Click on a place mark for location info and a link to more information. </li><li> For help, hover your pointer over an item for an explanation. </li><li> Bookmark the "Share" link to return to the same view later. </li></ul><a href="#" onclick="return false;" class="hide">Hide</a></div><div id="aboutText"><a href="#" onclick="return false;" class="hide">Hide</a><div><p> The nuclear, chemical, biological, and missile facilities depicted in this map correspond to content found in the NTI country profiles. Please see this content for further information and sources. Since definitive information on countries' NBC and missile facilities is often classified, the descriptions and mapped locations of these facilities are sometimes speculative, based on the most credible available open source material. </p><p> This material is produced independently for NTI by the James Martin Center for Nonproliferation Studies at the Monterey Institute of International Studies and does not necessarily reflect the opinions of and has not been independently verified by NTI or its directors, officers, employees, or agents. Copyright © 2011 by MIIS. </p></div><a href="#" onclick="return false;" class="hide">Hide</a></div><div id="mapFoot"><p id="disclaimer" onclick="return false;" class="note"> Find facilities with descriptions in these country profiles: </p><div id="mapSharing"><a href="#" class="stableLink" title="This URL will take you back to your current view.">Share</a> | <a href="#" onclick="return false;" id="about" class="stableLink" title="Click to show/hide disclamatory and reference related information.">About</a> | <a href="#" id="help" class="stableLink" onclick="return false;" title="Click to show/hide the basic overview.">Help</a></div><br /><br /><!--Thanks for ruining the internet IE --><div id="countryMenu"><a id="argentina" href="#" onclick="return false;" class="country" title="Center map over Argentina"></a><img src="images/argentina_dim.gif" class="preload cntrydown" /><a id="belarus" href="#" onclick="return false;" class="country" title="Center map over Belarus"></a><img src="images/belarus_dim.gif" class="preload cntrydown" /><a id="china" href="#" onclick="return false;" class="country" title="Center map over China"></a><img src="images/china_dim.gif" class="preload cntrydown" /><a id="cuba" href="#" onclick="return false;" class="country" title="Center map over Cuba"></a><img src="images/cuba_dim.gif" class="preload cntrydown" /><a id="egypt" href="#" onclick="return false;" class="country" title="Center map over Egypt"></a><img src="images/egypt_dim.gif" class="preload cntrydown" /><a id="india" href="#" onclick="return false;" class="country" title="Center map over India"></a><img src="images/india_dim.gif" class="preload cntrydown" /><a id="iran" href="#" onclick="return false;" class="country" title="Center map over Iran"></a><img src="images/iran_dim.gif" class="preload cntrydown" /><a id="israel" href="#" onclick="return false;" class="country" title="Center map over Israel"></a><img src="images/israel_dim.gif" class="preload cntrydown" /><a id="kazakhstan" href="#" onclick="return false;" class="country" title="Center map over Kazakhstan"></a><img src="images/kazakhstan_dim.gif" class="preload cntrydown" /><a id="north_korea" href="#" onclick="return false;" class="country" title="Center map over North Korea"></a><img src="images/north_korea_dim.gif" class="preload cntrydown" /><a id="pakistan" href="#" onclick="return false;" class="country" title="Center map over Pakistan"></a><img src="images/pakistan_dim.gif" class="preload cntrydown" /><a id="russia" href="#" onclick="return false;" class="country" title="Center map over Russia"></a><img src="images/russia_dim.gif" class="preload cntrydown" /><a id="south_korea" href="#" onclick="return false;" class="country" title="Center map over South Korea"></a><img src="images/south_korea_dim.gif" class="preload cntrydown" /><a id="syria" href="#" onclick="return false;" class="country" title="Center map over Syria"></a><img src="images/syria_dim.gif" class="preload cntrydown" /><a id="turkey" href="#" onclick="return false;" class="country" title="Center map over Turkey"></a><img src="images/turkey_dim.gif" class="preload cntrydown" /><img src="images/other.gif" class="preload cntrydown" /></div><h5 class="slowness">PLEASE NOTE: Due to the large amount of data processed, the map may be slow to respond.</h5></div><div class="topLeft"></div><div class="topRight"></div><div class="midRight"></div><div class="bottomMiddle"></div><div class="bottomLeft"></div><div class="bottomRight"></div><a href="http://www.nti.org" title="Visit the NTI homepage." class="logo"><img src="images/nti_logo_white_170x74.png" class="logo" /></a></div><script type="text/javascript">var Prototype={Version:"1.6.0",Browser:{IE:!(!window.attachEvent||window.opera),Opera:!!window.opera,WebKit:-1<navigator.userAgent.indexOf("AppleWebKit/"),Gecko:-1<navigator.userAgent.indexOf("Gecko")&&-1==navigator.userAgent.indexOf("KHTML"),MobileSafari:!!navigator.userAgent.match(/Apple.*Mobile.*Safari/)},BrowserFeatures:{XPath:!!document.evaluate,ElementExtensions:!!window.HTMLElement,SpecificElementExtensions:document.createElement("div").__proto__&&document.createElement("div").__proto__!==

document.createElement("form").__proto__},ScriptFragment:"< script [^> ] * > ([\\ S \\s] * ? ) < \ / script > " ,JSONFilter:/^\/\*-secure-([\s\S]*)\*\/\s*$/,emptyFunction:function(){},K:function(a){return a}};Prototype.Browser.MobileSafari&&(Prototype.BrowserFeatures.SpecificElementExtensions=!1);Prototype.Browser.WebKit&&(Prototype.BrowserFeatures.XPath=!1);

var Class={create:function(){function a(){this.initialize.apply(this,arguments)}var b=null,c=$A(arguments);Object.isFunction(c[0])&&(b=c.shift());Object.extend(a,Class.Methods);a.superclass=b;a.subclasses=[];if(b){var d=function(){};d.prototype=b.prototype;a.prototype=new d;b.subclasses.push(a)}for(b=0;b<c.length;b++)a.addMethods(c[b]);if(!a.prototype.initialize)a.prototype.initialize=Prototype.emptyFunction;return a.prototype.constructor=a},Methods:{addMethods:function(a){var b=this.superclass&&

this.superclass.prototype,c=Object.keys(a);Object.keys({toString:true}).length||c.push( " toString " , " valueOf " );for(var d=0,e=c.length;d<e;d++){var f=c[d],g=a[f];if(b&&Object.isFunction(g)&&g.argumentNames().first()== " $super " )var h=g,g=Object.extend(function(a){return function(){return b[a].apply(this,arguments)}}(f).wrap(h),{valueOf:function(){return h},toString:function(){return h.toString()}});this.prototype[f]=g}return this}}},Abstract={};Object.extend=function(a,b){for(var c in b)a[c]=b[c];return a};

Object.extend(Object,{inspect:function(a){try{return a===void 0? " undefined " :a===null? " null " :a.inspect?a.inspect():a.toString()}catch(b){if(b instanceof RangeError)return " ... " ;throw b;}},toJSON:function(a){switch(typeof a){case " undefined " :case " function ":case "unknown":return;case "boolean":return a. toString ()} if (a === null ) return " null " ; if ( a . toJSON ) return a . toJSON (); if ( ! Object . isElement (a)){ var b = [],c; for (c in a){ var d = Object . toJSON (a[c]);d !== void 0 && b . push ( c . toJSON () + " : " + d)} return " { " + b . join ( " , " ) +

" } " }},toQueryString : function ( a ){ return $H (a). toQueryString ()}, toHTML : function ( a ){ return a && a . toHTML ? a . toHTML () : String . interpret (a)}, keys : function ( a ){ var b = [],c; for (c in a) b . push (c); return b}, values : function ( a ){ var b = [],c; for (c in a) b . push (a[c]); return b}, clone : function ( a ){ return Object . extend ({},a)}, isElement : function ( a ){ return a && a . nodeType == 1 }, isArray : function ( a ){ return a && a . constructor === Array }, isHash : function ( a ){ return a instanceof Hash}, isFunction : function ( a ){ return typeof a == " function " }, isString : function ( a ){ return typeof a ==

" string " }, isNumber : function ( a ){ return typeof a == " number " }, isUndefined : function ( a ){ return typeof a == " undefined " }});

Object . extend ( Function . prototype ,{ argumentNames : function (){ var a = this . toString (). match ( / ^ [ \s \( ] * function [ ^ (] * \( ( . *? ) \) / )[ 1 ]. split ( " , " ). invoke ( " strip " ); return a . length == 1 &&! a[ 0 ] ? [] : a}, bind : function (){ if ( arguments . length < 2 && arguments [ 0 ] === void 0 ) return this ; var a = this ,b = $A ( arguments ),c = b . shift (); return function (){ return a . apply (c, b . concat ( $A ( arguments )))}}, bindAsEventListener : function (){ var a = this ,b = $A ( arguments ),c = b . shift (); return function ( d ){ return a . apply (c,[d || window . event ]. concat (b))}}, curry : function (){ if ( ! arguments . length ) return this ;

var a = this ,b = $A ( arguments ); return function (){ return a . apply ( this , b . concat ( $A ( arguments )))}}, delay : function (){ var a = this ,b = $A ( arguments ),c = b . shift () * 1E3 ; return window . setTimeout ( function (){ return a . apply (a,b)},c)}, wrap : function ( a ){ var b = this ; return function (){ return a . apply ( this ,[ b . bind ( this )]. concat ( $A ( arguments )))}}, methodize : function (){ if ( this . _methodized ) return this . _methodized ; var a = this ; return this . _methodized = function (){ return a . apply ( null ,[ this ]. concat ( $A ( arguments )))}}});

Function . prototype . defer = Function . prototype . delay . curry ( 0.01 ); Date . prototype . toJSON = function (){ return ' " ' + this . getUTCFullYear () + " - " + ( this . getUTCMonth () + 1 ). toPaddedString ( 2 ) + " - " + this . getUTCDate (). toPaddedString ( 2 ) + " T " + this . getUTCHours (). toPaddedString ( 2 ) + " : " + this . getUTCMinutes (). toPaddedString ( 2 ) + " : " + this . getUTCSeconds (). toPaddedString ( 2 ) + ' Z" ' }; var Try = { these : function (){ for ( var a,b = 0 ,c = arguments . length ;b < c;b ++ ){ var d = arguments [b]; try {a = d (); break } catch (e){}} return a}}; RegExp . prototype . match = RegExp . prototype . test ;

RegExp . escape = function ( a ){ return String (a). replace ( / ( [ . *+?^=!:${}()|[ \]\/\\ ] ) / g , " \\ $1 " )};

var PeriodicalExecuter = Class . create ({ initialize : function ( a , b ){ this . callback = a; this . frequency = b; this . currentlyExecuting = false ; this . registerCallback ()}, registerCallback : function (){ this . timer = setInterval ( this . onTimerEvent . bind ( this ), this . frequency * 1E3 )}, execute : function (){ this . callback ( this )}, stop : function (){ if ( this . timer ){ clearInterval ( this . timer ); this . timer = null }}, onTimerEvent : function (){ if ( ! this . currentlyExecuting ) try { this . currentlyExecuting = true ; this . execute ()} finally { this . currentlyExecuting = false }}});

Object . extend ( String ,{ interpret : function ( a ){ return a == null ? " " : String (a)},specialChar : { " \b " : " \\ b " , " \t " : " \\ t " , "

" : " \\ n " , " \f " : " \\ f " , " \r " : " \\ r " , " \\ " : " \\\\ " }});

Object . extend ( String . prototype ,{ gsub : function ( a , b ){ for ( var c = " " ,d = this ,e,b = arguments . callee . prepareReplacement (b); d . length > 0 ;) if (e = d . match (a)){c = c + d . slice ( 0 , e . index );c = c + String . interpret ( b (e));d = d . slice ( e . index + e[ 0 ]. length )} else {c = c + d;d = " " } return c}, sub : function ( a , b , c ){b = this . gsub . prepareReplacement (b);c = c === void 0 ? 1 : c; return this . gsub (a, function ( a ){ return -- c < 0 ? a[ 0 ] : b (a)})}, scan : function ( a , b ){ this . gsub (a,b); return String ( this )}, truncate : function ( a , b ){a = a || 30 ;b = b === void 0 ? " ... " : b; return this . length >

a ? this . slice ( 0 ,a - b . length ) + b : String ( this )}, strip : function (){ return this . replace ( / ^ \s + / , " " ). replace ( / \s + $ / , " " )}, stripTags : function (){ return this . replace ( / < \/ ? [ ^ >] + > / gi , " " )}, stripScripts : function (){ return this . replace ( RegExp ( Prototype . ScriptFragment , " img " ), " " )}, extractScripts : function (){ var a = RegExp ( Prototype . ScriptFragment , " im " ); return ( this . match ( RegExp ( Prototype . ScriptFragment , " img " )) || []). map ( function ( b ){ return ( b . match (a) || [ " " , " " ])[ 1 ]})}, evalScripts : function (){ return this . extractScripts (). map ( function ( a ){ return eval (a)})},

escapeHTML : function (){ var a = arguments . callee ; a . text . data = this ; return a . div . innerHTML }, unescapeHTML : function (){ var a = new Element ( " div " ); a . innerHTML = this . stripTags (); return a . childNodes [ 0 ] ? a . childNodes . length > 1 ? $A ( a . childNodes ). inject ( " " , function ( a , c ){ return a + c . nodeValue }) : a . childNodes [ 0 ]. nodeValue : " " }, toQueryParams : function ( a ){ var b = this . strip (). match ( / ( [ ^ ?#] * )(# . * ) ? $ / ); return ! b ? {} : b[ 1 ]. split (a || " & " ). inject ({}, function ( a , b ){ if ((b = b . split ( " = " ))[ 0 ]){ var e = decodeURIComponent ( b . shift ()),f = b . length > 1 ?

b . join ( " = " ) : b[ 0 ];f != void 0 && (f = decodeURIComponent (f)); if (e in a){ Object . isArray (a[e]) || (a[e] = [a[e]]);a[e]. push (f)} else a[e] = f} return a})}, toArray : function (){ return this . split ( " " )}, succ : function (){ return this . slice ( 0 , this . length - 1 ) + String . fromCharCode ( this . charCodeAt ( this . length - 1 ) + 1 )}, times : function ( a ){ return a < 1 ? " " : Array (a + 1 ). join ( this )}, camelize : function (){ var a = this . split ( " - " ),b = a . length ; if (b == 1 ) return a[ 0 ]; for ( var c = this . charAt ( 0 ) == " - " ? a[ 0 ]. charAt ( 0 ). toUpperCase () + a[ 0 ]. substring ( 1 ) : a[ 0 ],d = 1 ;d <

b;d ++ )c = c + (a[d]. charAt ( 0 ). toUpperCase () + a[d]. substring ( 1 )); return c}, capitalize : function (){ return this . charAt ( 0 ). toUpperCase () + this . substring ( 1 ). toLowerCase ()}, underscore : function (){ return this . gsub ( / :: / , " / " ). gsub ( / ( [ A-Z ] + )( [ A-Z ][ a-z ] ) / , " #{1}_#{2} " ). gsub ( / ( [ a-z \d ] )( [ A-Z ] ) / , " #{1}_#{2} " ). gsub ( / - / , " _ " ). toLowerCase ()}, dasherize : function (){ return this . gsub ( / _ / , " - " )}, inspect : function ( a ){ var b = this . gsub ( / [ \x00 - \x1f \\ ] / , function ( a ){ var b = String . specialChar [a[ 0 ]]; return b ? b : " \\ u00 " + a[ 0 ]. charCodeAt (). toPaddedString ( 2 ,

16 )}); return a ? ' " ' + b . replace ( / " / g , ' \\ " ' ) + ' " ' : " ' " + b . replace ( / ' / g , " \\ ' " ) + " ' " }, toJSON : function (){ return this . inspect ( true )}, unfilterJSON : function ( a ){ return this . sub (a || Prototype . JSONFilter , " #{1} " )}, isJSON : function (){ var a = this . replace ( / \\ . / g , " @ " ). replace ( / " [ ^ " \\

\r ] * " / g , " " ); return / ^ [,:{} \[\] 0-9 . \-+ Eaefln r-u

\r\t ] * $ / . test (a)}, evalJSON : function ( a ){ var b = this . unfilterJSON (); try { if ( ! a || b . isJSON ()) return eval ( " ( " + b + " ) " )} catch (c){} throw new SyntaxError ( " Badly formed JSON string: " + this . inspect ());}, include : function ( a ){ return this . indexOf (a) >

- 1 }, startsWith : function ( a ){ return this . indexOf (a) === 0 }, endsWith : function ( a ){ var b = this . length - a . length ; return b >= 0 && this . lastIndexOf (a) === b}, empty : function (){ return this == " " }, blank : function (){ return / ^ \s * $ / . test ( this )}, interpolate : function ( a , b ){ return ( new Template ( this ,b)). evaluate (a)}});

( Prototype . Browser . WebKit || Prototype . Browser . IE ) && Object . extend ( String . prototype ,{ escapeHTML : function (){ return this . replace ( / & / g , " & " ). replace ( / < / g , " < " ). replace ( / > / g , " > " )}, unescapeHTML : function (){ return this . replace ( / & / g , " & " ). replace ( / < / g , " < " ). replace ( / > / g , " > " )}}); String . prototype . gsub . prepareReplacement = function ( a ){ if ( Object . isFunction (a)) return a; var b = new Template (a); return function ( a ){ return b . evaluate (a)}}; String . prototype . parseQuery = String . prototype . toQueryParams ;

Object . extend ( String . prototype . escapeHTML ,{div : document . createElement ( " div " ),text : document . createTextNode ( " " )}); with ( String . prototype . escapeHTML ) div . appendChild (text);

var Template = Class . create ({ initialize : function ( a , b ){ this . template = a . toString (); this . pattern = b || Template . Pattern }, evaluate : function ( a ){ Object . isFunction ( a . toTemplateReplacements ) && (a = a . toTemplateReplacements ()); return this . template . gsub ( this . pattern , function ( b ){ if (a == null ) return " " ; var c = b[ 1 ] || " " ; if (c == " \\ " ) return b[ 2 ]; var d = a,e = b[ 3 ],f = / ^ ( [ ^ . [] + | \[ ((?: . *? [ ^ \\ ] ) ? ) \] )( \. | \[ | $ ) / ,b = f . exec (e); if (b == null ) return c; for (;b != null ;){ var g = b[ 1 ]. startsWith ( " [ " ) ? b[ 2 ]. gsub ( " \\\\ ] " , " ] " ) : b[ 1 ],d = d[g]; if ( null == d || " " ==

b[ 3 ]) break ;e = e . substring ( " [ " == b[ 3 ] ? b[ 1 ]. length : b[ 0 ]. length );b = f . exec (e)} return c + String . interpret (d)}. bind ( this ))}}); Template . Pattern = / ( ^ | . | \r |

)(# \{ ( . *? ) \} ) / ;

var $ break = {},Enumerable = { each : function ( a , b ){ var c = 0 ,a = a . bind (b); try { this . _each ( function ( b ){ a (b,c ++ )})} catch (d){ if (d != $ break ) throw d;} return this }, eachSlice : function ( a , b , c ){ for ( var b = b ? b . bind (c) : Prototype . K ,d = - a,e = [],f = this . toArray ();(d = d + a) < f . length ;) e . push ( f . slice (d,d + a)); return e . collect (b,c)}, all : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c = true ; this . each ( function ( b , e ){c = c &&!! a (b,e); if ( ! c) throw $ break ;}); return c}, any : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c = false ; this . each ( function ( b , e ){ if (c =

!! a (b,e)) throw $ break ;}); return c}, collect : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c = []; this . each ( function ( b , e ){ c . push ( a (b,e))}); return c}, detect : function ( a , b ){ var a = a . bind (b),c; this . each ( function ( b , e ){ if ( a (b,e)){c = b; throw $ break ;}}); return c}, findAll : function ( a , b ){ var a = a . bind (b),c = []; this . each ( function ( b , e ){ a (b,e) && c . push (b)}); return c}, grep : function ( a , b , c ){ var b = b ? b . bind (c) : Prototype . K ,d = []; Object . isString (a) && (a = RegExp (a)); this . each ( function ( c , f ){ a . match (c) && d . push ( b (c,f))}); return d}, include : function ( a ){ if ( Object . isFunction ( this . indexOf ) &&

this . indexOf (a) != - 1 ) return true ; var b = false ; this . each ( function ( c ){ if (c == a){b = true ; throw $ break ;}}); return b}, inGroupsOf : function ( a , b ){b = b === void 0 ? null : b; return this . eachSlice (a, function ( c ){ for (; c . length < a;) c . push (b); return c})}, inject : function ( a , b , c ){b = b . bind (c); this . each ( function ( c , e ){a = b (a,c,e)}); return a}, invoke : function ( a ){ var b = $A ( arguments ). slice ( 1 ); return this . map ( function ( c ){ return c[a]. apply (c,b)})}, max : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c; this . each ( function ( b , e ){b = a (b,e); if (c ==

void 0 || b >= c)c = b}); return c}, min : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c; this . each ( function ( b , e ){b = a (b,e); if (c == void 0 || b < c)c = b}); return c}, partition : function ( a , b ){ var a = a ? a . bind (b) : Prototype . K ,c = [],d = []; this . each ( function ( b , f ){( a (b,f) ? c : d). push (b)}); return [c,d]}, pluck : function ( a ){ var b = []; this . each ( function ( c ){ b . push (c[a])}); return b}, reject : function ( a , b ){ var a = a . bind (b),c = []; this . each ( function ( b , e ){ a (b,e) || c . push (b)}); return c}, sortBy : function ( a , b ){a = a . bind (b); return this . map ( function ( b , d ){ return {value : b,

criteria : a (b,d)}}). sort ( function ( a , b ){ var e = a . criteria ,f = b . criteria ; return e < f ? - 1 : e > f ? 1 : 0 }). pluck ( " value " )}, toArray : function (){ return this . map ()}, zip : function (){ var a = Prototype . K ,b = $A ( arguments ); Object . isFunction ( b . last ()) && (a = b . pop ()); var c = [ this ]. concat (b). map ( $A ); return this . map ( function ( b , e ){ return a ( c . pluck (e))})}, size : function (){ return this . toArray (). length }, inspect : function (){ return " #<Enumerable: " + this . toArray (). inspect () + " > " }};

Object . extend (Enumerable,{map : Enumerable . collect ,find : Enumerable . detect ,select : Enumerable . findAll ,filter : Enumerable . findAll ,member : Enumerable . include ,entries : Enumerable . toArray ,every : Enumerable . all ,some : Enumerable . any }); function $A ( a ){ if ( ! a) return []; if ( a . toArray ) return a . toArray (); for ( var b = a . length ,c = Array (b);b -- ;)c[b] = a[b]; return c}

Prototype . Browser . WebKit && ( $A = function ( a ){ if ( ! a) return []; if ( ! ( Object . isFunction (a) && a == " [object NodeList] " ) && a . toArray ) return a . toArray (); for ( var b = a . length ,c = Array (b);b -- ;)c[b] = a[b]; return c}); Array . from = $A ; Object . extend ( Array . prototype ,Enumerable); Array . prototype . _reverse || ( Array . prototype . _reverse = Array . prototype . reverse );

Object . extend ( Array . prototype ,{ _each : function ( a ){ for ( var b = 0 ,c = this . length ;b < c;b ++ ) a ( this [b])}, clear : function (){ this . length = 0 ; return this }, first : function (){ return this [ 0 ]}, last : function (){ return this [ this . length - 1 ]}, compact : function (){ return this . select ( function ( a ){ return a != null })}, flatten : function (){ return this . inject ([], function ( a , b ){ return a . concat ( Object . isArray (b) ? b . flatten () : [b])})}, without : function (){ var a = $A ( arguments ); return this . select ( function ( b ){ return ! a . include (b)})}, reverse : function ( a ){ return (a !==

false ? this : this . toArray ()). _reverse ()}, reduce : function (){ return this . length > 1 ? this : this [ 0 ]}, uniq : function ( a ){ return this . inject ([], function ( b , c , d ){( 0 == d || (a ? b . last () != c : ! b . include (c))) && b . push (c); return b})}, intersect : function ( a ){ return this . uniq (). findAll ( function ( b ){ return a . detect ( function ( a ){ return b === a})})}, clone : function (){ return []. concat ( this )}, size : function (){ return this . length }, inspect : function (){ return " [ " + this . map ( Object . inspect ). join ( " , " ) + " ] " }, toJSON : function (){ var a = []; this . each ( function ( b ){b =

Object . toJSON (b);b !== void 0 && a . push (b)}); return " [ " + a . join ( " , " ) + " ] " }}); Object . isFunction ( Array . prototype . forEach ) && ( Array . prototype . _each = Array . prototype . forEach ); Array . prototype . indexOf || ( Array . prototype . indexOf = function ( a , b ){b || (b = 0 ); var c = this . length ; for (b < 0 && (b = c + b);b < c;b ++ ) if ( this [b] === a) return b; return - 1 }); Array . prototype . lastIndexOf || ( Array . prototype . lastIndexOf = function ( a , b ){ var b = isNaN (b) ? this . length : (b < 0 ? this . length + b : b) + 1 ,c = this . slice ( 0 ,b). reverse (). indexOf (a); return c < 0 ? c : b - c - 1 });

Array . prototype . toArray = Array . prototype . clone ; function $w ( a ){ if ( ! Object . isString (a)) return []; return (a = a . strip ()) ? a . split ( / \s + / ) : []} Prototype . Browser . Opera && ( Array . prototype . concat = function (){ for ( var a = [],b = 0 ,c = this . length ;b < c;b ++ ) a . push ( this [b]);b = 0 ; for (c = arguments . length ;b < c;b ++ ) if ( Object . isArray ( arguments [b])) for ( var d = 0 ,e = arguments [b]. length ;d < e;d ++ ) a . push ( arguments [b][d]); else a . push ( arguments [b]); return a});

Object . extend ( Number . prototype ,{ toColorPart : function (){ return this . toPaddedString ( 2 , 16 )}, succ : function (){ return this + 1 }, times : function ( a ){ $R ( 0 , this , true ). each (a); return this }, toPaddedString : function ( a , b ){ var c = this . toString (b || 10 ); return " 0 " . times (a - c . length ) + c}, toJSON : function (){ return isFinite ( this ) ? this . toString () : " null " }}); $w ( " abs round ceil floor " ). each ( function ( a ){ Number . prototype [a] = Math [a]. methodize ()}); function $H ( a ){ return new Hash (a)}

var Hash = Class . create (Enumerable, function (){ function a ( a , b ){ return Object . isUndefined (b) ? a : a + " = " + encodeURIComponent ( String . interpret (b))} var b = 0 , c = function ( a ){ this . key = a}; c . prototype . key = " foo " ; for ( var d in new c ( " bar " ))b ++ ; return { initialize : function ( a ){ this . _object = Object . isHash (a) ? a . toObject () : Object . clone (a)},_each : b > 1 ? function ( a ){ var b = [],c; for (c in this . _object ){ var d = this . _object [c]; if ( ! b . include (c)){ b . push (c); var i = [c,d]; i . key = c; i . value = d; a (i)}}} : function ( a ){ for ( var b in this . _object ){ var c =

this . _object [b],d = [b,c]; d . key = b; d . value = c; a (d)}}, set : function ( a , b ){ return this . _object [a] = b}, get : function ( a ){ return this . _object [a]}, unset : function ( a ){ var b = this . _object [a]; delete this . _object [a]; return b}, toObject : function (){ return Object . clone ( this . _object )}, keys : function (){ return this . pluck ( " key " )}, values : function (){ return this . pluck ( " value " )}, index : function ( a ){ var b = this . detect ( function ( b ){ return b . value === a}); return b && b . key }, merge : function ( a ){ return this . clone (). update (a)}, update : function ( a ){ return ( new Hash (a)). inject ( this ,

function ( a , b ){ a . set ( b . key , b . value ); return a})}, toQueryString : function (){ return this . map ( function ( b ){ var c = encodeURIComponent ( b . key ); return (b = b . value ) && typeof b == " object " && Object . isArray (b) ? b . map ( a . curry (c)). join ( " & " ) : a (c,b)}). join ( " & " )}, inspect : function (){ return " #<Hash:{ " + this . map ( function ( a ){ return a . map ( Object . inspect ). join ( " : " )}). join ( " , " ) + " }> " }, toJSON : function (){ return Object . toJSON ( this . toObject ())}, clone : function (){ return new Hash ( this )}}}()); Hash . prototype . toTemplateReplacements = Hash . prototype . toObject ;

Hash . from = $H ;

var ObjectRange = Class . create (Enumerable,{ initialize : function ( a , b , c ){ this . start = a; this . end = b; this . exclusive = c}, _each : function ( a ){ for ( var b = this . start ; this . include (b);){ a (b);b = b . succ ()}}, include : function ( a ){ return a < this . start ? false : this . exclusive ? a < this . end : a <= this . end }}), $R = function ( a , b , c ){ return new ObjectRange (a,b,c)},Ajax = { getTransport : function (){ return Try . these ( function (){ return new XMLHttpRequest }, function (){ return new ActiveXObject ( " Msxml2.XMLHTTP " )}, function (){ return new ActiveXObject ( " Microsoft.XMLHTTP " )}) || false },

activeRequestCount : 0 ,Responders : {responders : [], _each : function ( a ){ this . responders . _each (a)}, register : function ( a ){ this . include (a) || this . responders . push (a)}, unregister : function ( a ){ this . responders = this . responders . without (a)}, dispatch : function ( a , b , c , d ){ this . each ( function ( e ){ if ( Object . isFunction (e[a])) try {e[a]. apply (e,[b,c,d])} catch (f){}})}}}; Object . extend ( Ajax . Responders ,Enumerable); Ajax . Responders . register ({ onCreate : function (){ Ajax . activeRequestCount ++ }, onComplete : function (){ Ajax . activeRequestCount -- }});

Ajax . Base = Class . create ({ initialize : function ( a ){ this . options = {method : " post " ,asynchronous : true ,contentType : " application/x-www-form-urlencoded " ,encoding : " UTF-8 " ,parameters : " " ,evalJSON : true ,evalJS : true }; Object . extend ( this . options ,a || {}); this . options . method = this . options . method . toLowerCase (); if ( Object . isString ( this . options . parameters )) this . options . parameters = this . options . parameters . toQueryParams ()}});

Ajax . Request = Class . create ( Ajax . Base ,{_complete : ! 1 , initialize : function ( $super , b , c ){ $super (c); this . transport = Ajax . getTransport (); this . request (b)}, request : function ( a ){ this . url = a; this . method = this . options . method ;a = Object . clone ( this . options . parameters ); if ( ! [ " get " , " post " ]. include ( this . method )){ a . _method = this . method ; this . method = " post " } this . parameters = a; if (a = Object . toQueryString (a)) this . method == " get " ? this . url = this . url + (( this . url . include ( " ? " ) ? " & " : " ? " ) + a) : / Konqueror | Safari | KHTML / . test ( navigator . userAgent ) &&

(a = a + " &_= " ); try { var b = new Ajax.Response ( this ); if ( this . options . onCreate ) this . options . onCreate (b); Ajax . Responders . dispatch ( " onCreate " , this ,b); this . transport . open ( this . method . toUpperCase (), this . url , this . options . asynchronous ); this . options . asynchronous && this . respondToReadyState . bind ( this ). defer ( 1 ); this . transport . onreadystatechange = this . onStateChange . bind ( this ); this . setRequestHeaders (); this . body = this . method == " post " ? this . options . postBody || a : null ; this . transport . send ( this . body ); if ( ! this . options . asynchronous &&

this . transport . overrideMimeType ) this . onStateChange ()} catch (c){ this . dispatchException (c)}}, onStateChange : function (){ var a = this . transport . readyState ;a > 1 &&! (a == 4 && this . _complete ) && this . respondToReadyState ( this . transport . readyState )}, setRequestHeaders : function (){ var a = { " X-Requested-With " : " XMLHttpRequest " , " X-Prototype-Version " : Prototype . Version ,Accept : " text/javascript, text/html, application/xml, text/xml, */* " }; if ( this . method == " post " ){a[ " Content-type " ] = this . options . contentType + ( this . options . encoding ?

" ; charset= " + this . options . encoding : " " ); if ( this . transport . overrideMimeType && ( navigator . userAgent . match ( / Gecko \/ ( \d {4} ) / ) || [ 0 , 2005 ])[ 1 ] < 2005 ) a . Connection = " close " } if ( typeof this . options . requestHeaders == " object " ){ var b = this . options . requestHeaders ; if ( Object . isFunction ( b . push )) for ( var c = 0 ,d = b . length ;c < d;c = c + 2 )a[b[c]] = b[c + 1 ]; else $H (b). each ( function ( b ){a[ b . key ] = b . value })} for ( var e in a) this . transport . setRequestHeader (e,a[e])}, success : function (){ var a = this . getStatus (); return ! a || a >= 200 && a < 300 }, getStatus : function (){ try { return this . transport . status ||

0 } catch (a){ return 0 }}, respondToReadyState : function ( a ){ var a = Ajax . Request . Events [a],b = new Ajax.Response ( this ); if (a == " Complete " ){ try { this . _complete = true ;( this . options [ " on " + b . status ] || this . options [ " on " + ( this . success () ? " Success " : " Failure " )] || Prototype . emptyFunction )(b, b . headerJSON )} catch (c){ this . dispatchException (c)} var d = b . getHeader ( " Content-type " );( this . options . evalJS == " force " || this . options . evalJS && d && d . match ( / ^ \s * (text | application) \/ (x-) ? (java | ecma)script(; . * ) ? \s * $ / i )) && this . evalResponse ()} try {( this . options [ " on " +

a] || Prototype . emptyFunction )(b, b . headerJSON ); Ajax . Responders . dispatch ( " on " + a, this ,b, b . headerJSON )} catch (e){ this . dispatchException (e)} if (a == " Complete " ) this . transport . onreadystatechange = Prototype . emptyFunction }, getHeader : function ( a ){ try { return this . transport . getResponseHeader (a)} catch (b){ return null }}, evalResponse : function (){ try { return eval (( this . transport . responseText || " " ). unfilterJSON ())} catch (a){ this . dispatchException (a)}}, dispatchException : function ( a ){( this . options . onException || Prototype . emptyFunction )( this ,

a); Ajax . Responders . dispatch ( " onException " , this ,a)}}); Ajax . Request . Events = [ " Uninitialized " , " Loading " , " Loaded " , " Interactive " , " Complete " ];

Ajax . Response = Class . create ({ initialize : function ( a ){ this . request = a; var a = this . transport = a . transport ,b = this . readyState = a . readyState ; if (b > 2 &&! Prototype . Browser . IE || b == 4 ){ this . status = this . getStatus (); this . statusText = this . getStatusText (); this . responseText = String . interpret ( a . responseText ); this . headerJSON = this . _getHeaderJSON ()} if (b == 4 ){a = a . responseXML ; this . responseXML = a === void 0 ? null : a; this . responseJSON = this . _getResponseJSON ()}},status : 0 ,statusText : " " ,getStatus : Ajax . Request . prototype . getStatus , getStatusText : function (){ try { return this . transport . statusText ||

" " } catch (a){ return " " }},getHeader : Ajax . Request . prototype . getHeader , getAllHeaders : function (){ try { return this . getAllResponseHeaders ()} catch (a){ return null }}, getResponseHeader : function ( a ){ return this . transport . getResponseHeader (a)}, getAllResponseHeaders : function (){ return this . transport . getAllResponseHeaders ()}, _getHeaderJSON : function (){ var a = this . getHeader ( " X-JSON " ); if ( ! a) return null ;a = decodeURIComponent ( escape (a)); try { return a . evalJSON ( this . request . options . sanitizeJSON )} catch (b){ this . request . dispatchException (b)}},

_getResponseJSON : function (){ var a = this . request . options ; if ( ! a . evalJSON || a . evalJSON != " force " &&! ( this . getHeader ( " Content-type " ) || " " ). include ( " application/json " )) return null ; try { return this . transport . responseText . evalJSON ( a . sanitizeJSON )} catch (b){ this . request . dispatchException (b)}}});

Ajax . Updater = Class . create ( Ajax . Request ,{ initialize : function ( $super , b , c , d ){ this . container = {success : b . success || b,failure : b . failure || ( b . success ? null : b)}; var d = d || {},e = d . onComplete ; d . onComplete = function ( b , c ){ this . updateContent ( b . responseText ); Object . isFunction (e) && e (b,c)}. bind ( this ); $super (c,d)}, updateContent : function ( a ){ var b = this . container [ this . success () ? " success " : " failure " ],c = this . options ; c . evalScripts || (a = a . stripScripts ()); if (b = $ (b)) if ( c . insertion ) if ( Object . isString ( c . insertion )){ var d = {};d[ c . insertion ] =

a; b . insert (d)} else c . insertion (b,a); else b . update (a); this . success () && this . onComplete && this . onComplete . bind ( this ). defer ()}});

Ajax . PeriodicalUpdater = Class . create ( Ajax . Base ,{ initialize : function ( $super , b , c , d ){ $super (d); this . onComplete = this . options . onComplete ; this . frequency = this . options . frequency || 2 ; this . decay = this . options . decay || 1 ; this . updater = {}; this . container = b; this . url = c; this . start ()}, start : function (){ this . options . onComplete = this . updateComplete . bind ( this ); this . onTimerEvent ()}, stop : function (){ this . updater . options . onComplete = void 0 ; clearTimeout ( this . timer );( this . onComplete || Prototype . emptyFunction ). apply ( this , arguments )},

updateComplete : function ( a ){ if ( this . options . decay ){ this . decay = a . responseText == this . lastText ? this . decay * this . options . decay : 1 ; this . lastText = a . responseText } this . timer = this . onTimerEvent . bind ( this ). delay ( this . decay * this . frequency )}, onTimerEvent : function (){ this . updater = new Ajax.Updater ( this . container , this . url , this . options )}});

function $ ( a ){ if ( arguments . length > 1 ){ for ( var b = 0 ,c = [],d = arguments . length ;b < d;b ++ ) c . push ( $ ( arguments [b])); return c} Object . isString (a) && (a = document . getElementById (a)); return Element . extend (a)} Prototype . BrowserFeatures . XPath && ( document . _getElementsByXPath = function ( a , b ){ for ( var c = [],d = document . evaluate (a, $ (b) || document , null , XPathResult . ORDERED_NODE_SNAPSHOT_TYPE , null ),e = 0 ,f = d . snapshotLength ;e < f;e ++ ) c . push ( Element . extend ( d . snapshotItem (e))); return c}); if ( ! window . Node ) var Node = {};

Node . ELEMENT_NODE || Object . extend ( Node ,{ ELEMENT_NODE : 1 , ATTRIBUTE_NODE : 2 , TEXT_NODE : 3 , CDATA_SECTION_NODE : 4 , ENTITY_REFERENCE_NODE : 5 , ENTITY_NODE : 6 , PROCESSING_INSTRUCTION_NODE : 7 , COMMENT_NODE : 8 , DOCUMENT_NODE : 9 , DOCUMENT_TYPE_NODE : 10 , DOCUMENT_FRAGMENT_NODE : 11 , NOTATION_NODE : 12 });

( function (){ var a = this . Element ; this . Element = function ( a , c ){ var c = c || {},a = a . toLowerCase (),d = Element . cache ; if ( Prototype . Browser . IE && c . name ){a = " < " + a + ' name=" ' + c . name + ' "> ' ; delete c . name ; return Element . writeAttribute ( document . createElement (a),c)}d[a] || (d[a] = Element . extend ( document . createElement (a))); return Element . writeAttribute (d[a]. cloneNode ( false ),c)}; Object . extend ( this . Element ,a || {})}). call ( window ); Element . cache = {};

Element . Methods = { visible : function ( a ){ return $ (a). style . display != " none " }, toggle : function ( a ){a = $ (a); Element [ Element . visible (a) ? " hide " : " show " ](a); return a}, hide : function ( a ){ $ (a). style . display = " none " ; return a}, show : function ( a ){ $ (a). style . display = " " ; return a}, remove : function ( a ){a = $ (a); a . parentNode . removeChild (a); return a}, update : function ( a , b ){a = $ (a);b && b . toElement && (b = b . toElement ()); if ( Object . isElement (b)) return a . update (). insert (b);b = Object . toHTML (b); a . innerHTML = b . stripScripts (); b . evalScripts . bind (b). defer ();

return a}, replace : function ( a , b ){a = $ (a); if (b && b . toElement )b = b . toElement (); else if ( ! Object . isElement (b)){ var b = Object . toHTML (b),c = a . ownerDocument . createRange (); c . selectNode (a); b . evalScripts . bind (b). defer ();b = c . createContextualFragment ( b . stripScripts ())} a . parentNode . replaceChild (b,a); return a}, insert : function ( a , b ){a = $ (a); if ( Object . isString (b) || Object . isNumber (b) || Object . isElement (b) || b && ( b . toElement || b . toHTML ))b = {bottom : b}; var c,d,e; for (position in b){c = b[position];position = position . toLowerCase ();d =

Element . _insertionTranslations [position];c && c . toElement && (c = c . toElement ()); if ( Object . isElement (c)) d . insert (a,c); else {c = Object . toHTML (c);e = a . ownerDocument . createRange (); d . initializeRange (a,e); d . insert (a, e . createContextualFragment ( c . stripScripts ())); c . evalScripts . bind (c). defer ()}} return a}, wrap : function ( a , b , c ){a = $ (a); Object . isElement (b) ? $ (b). writeAttribute (c || {}) : b = Object . isString (b) ? new Element (b,c) : new Element ( " div " ,b); a . parentNode && a . parentNode . replaceChild (b,a); b . appendChild (a); return b}, inspect : function ( a ){ var a =

$ (a),b = " < " + a . tagName . toLowerCase (); $H ({id : " id " ,className : " class " }). each ( function ( c ){ var d = c . first (),c = c . last ();(d = (a[d] || " " ). toString ()) && (b = b + ( " " + c + " = " + d . inspect ( true )))}); return b + " > " }, recursivelyCollect : function ( a , b ){ for ( var a = $ (a),c = [];a = a[b];) a . nodeType == 1 && c . push ( Element . extend (a)); return c}, ancestors : function ( a ){ return $ (a). recursivelyCollect ( " parentNode " )}, descendants : function ( a ){ return $A ( $ (a). getElementsByTagName ( " * " )). each ( Element . extend )}, firstDescendant : function ( a ){ for (a = $ (a). firstChild ;a &&

a . nodeType != 1 ;)a = a . nextSibling ; return $ (a)}, immediateDescendants : function ( a ){ if ( ! (a = $ (a). firstChild )) return []; for (;a && a . nodeType != 1 ;)a = a . nextSibling ; return a ? [a]. concat ( $ (a). nextSiblings ()) : []}, previousSiblings : function ( a ){ return $ (a). recursivelyCollect ( " previousSibling " )}, nextSiblings : function ( a ){ return $ (a). recursivelyCollect ( " nextSibling " )}, siblings : function ( a ){a = $ (a); return a . previousSiblings (). reverse (). concat ( a . nextSiblings ())}, match : function ( a , b ){ Object . isString (b) && (b = new Selector (b)); return b . match ( $ (a))},

up : function ( a , b , c ){a = $ (a); if ( arguments . length == 1 ) return $ ( a . parentNode ); var d = a . ancestors (); return b ? Selector . findElement (d,b,c) : d[c || 0 ]}, down : function ( a , b , c ){a = $ (a); if ( arguments . length == 1 ) return a . firstDescendant (); var d = a . descendants (); return b ? Selector . findElement (d,b,c) : d[c || 0 ]}, previous : function ( a , b , c ){a = $ (a); if ( arguments . length == 1 ) return $ ( Selector . handlers . previousElementSibling (a)); var d = a . previousSiblings (); return b ? Selector . findElement (d,b,c) : d[c || 0 ]}, next : function ( a , b , c ){a = $ (a); if ( arguments . length ==

1 ) return $ ( Selector . handlers . nextElementSibling (a)); var d = a . nextSiblings (); return b ? Selector . findElement (d,b,c) : d[c || 0 ]}, select : function (){ var a = $A ( arguments ),b = $ ( a . shift ()); return Selector . findChildElements (b,a)}, adjacent : function (){ var a = $A ( arguments ),b = $ ( a . shift ()); return Selector . findChildElements ( b . parentNode ,a). without (b)}, identify : function ( a ){ var a = $ (a),b = a . readAttribute ( " id " ),c = arguments . callee ; if (b) return b; do b = " anonymous_element_ " + c . counter ++ ; while ( $ (b)); a . writeAttribute ( " id " ,b); return b},

readAttribute : function ( a , b ){a = $ (a); if ( Prototype . Browser . IE ){ var c = Element . _attributeTranslations . read ; if ( c . values [b]) return c . values [b](a,b); c . names [b] && (b = c . names [b]); if ( b . include ( " : " )) return ! a . attributes ||! a . attributes [b] ? null : a . attributes [b]. value } return a . getAttribute (b)}, writeAttribute : function ( a , b , c ){ var a = $ (a),d = {},e = Element . _attributeTranslations . write ; typeof b == " object " ? d = b : d[b] = c === void 0 ? true : c; for ( var f in d){b = e . names [f] || f;c = d[f]; e . values [f] && (b = e . values [f](a,c));c === false || c === null ?

a . removeAttribute (b) : c === true ? a . setAttribute (b,b) : a . setAttribute (b,c)} return a}, getHeight : function ( a ){ return $ (a). getDimensions (). height }, getWidth : function ( a ){ return $ (a). getDimensions (). width }, classNames : function ( a ){ return new Element.ClassNames (a)}, hasClassName : function ( a , b ){ if (a = $ (a)){ var c = a . className ; return c . length > 0 && (c == b || RegExp ( " (^| \\ s) " + b + " ( \\ s|$) " ). test (c))}}, addClassName : function ( a , b ){ if (a = $ (a)){ if ( ! a . hasClassName (b)) a . className = a . className + (( a . className ? " " : " " ) + b); return a}}, removeClassName : function ( a ,

b ){ if (a = $ (a)){ a . className = a . className . replace ( RegExp ( " (^| \\ s+) " + b + " ( \\ s+|$) " ), " " ). strip (); return a}}, toggleClassName : function ( a , b ){ if (a = $ (a)) return a[ a . hasClassName (b) ? " removeClassName " : " addClassName " ](b)}, cleanWhitespace : function ( a ){ for ( var a = $ (a),b = a . firstChild ;b;){ var c = b . nextSibling ; b . nodeType == 3 &&! / \S / . test ( b . nodeValue ) && a . removeChild (b);b = c} return a}, empty : function ( a ){ return $ (a). innerHTML . blank ()}, descendantOf : function ( a , b ){a = $ (a);b = $ (b); if ( a . compareDocumentPosition ) return ( a . compareDocumentPosition (b) &

8 ) === 8 ; if ( a . sourceIndex &&! Prototype . Browser . Opera ){ var c = a . sourceIndex ,d = b . sourceIndex ,e = b . nextSibling ; if ( ! e){ do b = b . parentNode ; while ( ! (e = b . nextSibling ) && b . parentNode )} if (e) return c > d && c < e . sourceIndex } for (;a = a . parentNode ;) if (a == b) return true ; return false }, scrollTo : function ( a ){ var a = $ (a),b = a . cumulativeOffset (); window . scrollTo (b[ 0 ],b[ 1 ]); return a}, getStyle : function ( a , b ){ var a = $ (a),b = b == " float " ? " cssFloat " : b . camelize (),c = a . style [b]; if ( ! c)c = (c = document . defaultView . getComputedStyle (a, null )) ? c[b] : null ; return b ==

" opacity " ? c ? parseFloat (c) : 1 : c == " auto " ? null : c}, getOpacity : function ( a ){ return $ (a). getStyle ( " opacity " )}, setStyle : function ( a , b ){ var a = $ (a),c = a . style ; if ( Object . isString (b)){ a . style . cssText = a . style . cssText + ( " ; " + b); return b . include ( " opacity " ) ? a . setOpacity ( b . match ( / opacity: \s * ( \d ? \. ? \d * ) / )[ 1 ]) : a} for ( var d in b)d == " opacity " ? a . setOpacity (b[d]) : c[d == " float " || d == " cssFloat " ? c . styleFloat === void 0 ? " cssFloat " : " styleFloat " : d] = b[d]; return a}, setOpacity : function ( a , b ){a = $ (a); a . style . opacity = b == 1 || b === " " ? " " : b < 1E-5 ? 0 :

b; return a}, getDimensions : function ( a ){ var a = $ (a),b = $ (a). getStyle ( " display " ); if (b != " none " && b != null ) return {width : a . offsetWidth ,height : a . offsetHeight }; var b = a . style ,c = b . visibility ,d = b . position ,e = b . display ; b . visibility = " hidden " ; b . position = " absolute " ; b . display = " block " ; var f = a . clientWidth ,a = a . clientHeight ; b . display = e; b . position = d; b . visibility = c; return {width : f,height : a}}, makePositioned : function ( a ){ var a = $ (a),b = Element . getStyle (a, " position " ); if (b == " static " ||! b){ a . _madePositioned = true ; a . style . position = " relative " ;

if ( window . opera ){ a . style . top = 0 ; a . style . left = 0 }} return a}, undoPositioned : function ( a ){a = $ (a); if ( a . _madePositioned ){ a . _madePositioned = void 0 ; a . style . position = a . style . top = a . style . left = a . style . bottom = a . style . right = " " } return a}, makeClipping : function ( a ){a = $ (a); if ( a . _overflow ) return a; a . _overflow = Element . getStyle (a, " overflow " ) || " auto " ; if ( a . _overflow !== " hidden " ) a . style . overflow = " hidden " ; return a}, undoClipping : function ( a ){a = $ (a); if ( ! a . _overflow ) return a; a . style . overflow = a . _overflow == " auto " ? " " : a . _overflow ; a . _overflow =

null ; return a}, cumulativeOffset : function ( a ){ var b = 0 ,c = 0 ; do {b = b + ( a . offsetTop || 0 );c = c + ( a . offsetLeft || 0 );a = a . offsetParent } while (a); return Element . _returnOffset (c,b)}, positionedOffset : function ( a ){ var b = 0 ,c = 0 ; do {b = b + ( a . offsetTop || 0 );c = c + ( a . offsetLeft || 0 ); if (a = a . offsetParent ){ if ( a . tagName == " BODY " ) break ; var d = Element . getStyle (a, " position " ); if (d == " relative " || d == " absolute " ) break }} while (a); return Element . _returnOffset (c,b)}, absolutize : function ( a ){a = $ (a); if ( a . getStyle ( " position " ) != " absolute " ){ var b = a . positionedOffset (),

c = b[ 1 ],b = b[ 0 ],d = a . clientWidth ,e = a . clientHeight ; a . _originalLeft = b - parseFloat ( a . style . left || 0 ); a . _originalTop = c - parseFloat ( a . style . top || 0 ); a . _originalWidth = a . style . width ; a . _originalHeight = a . style . height ; a . style . position = " absolute " ; a . style . top = c + " px " ; a . style . left = b + " px " ; a . style . width = d + " px " ; a . style . height = e + " px " ; return a}}, relativize : function ( a ){a = $ (a); if ( a . getStyle ( " position " ) != " relative " ){ a . style . position = " relative " ; var b = parseFloat ( a . style . top || 0 ) - ( a . _originalTop || 0 ),c = parseFloat ( a . style . left || 0 ) -

( a . _originalLeft || 0 ); a . style . top = b + " px " ; a . style . left = c + " px " ; a . style . height = a . _originalHeight ; a . style . width = a . _originalWidth ; return a}}, cumulativeScrollOffset : function ( a ){ var b = 0 ,c = 0 ; do {b = b + ( a . scrollTop || 0 );c = c + ( a . scrollLeft || 0 );a = a . parentNode } while (a); return Element . _returnOffset (c,b)}, getOffsetParent : function ( a ){ if ( a . offsetParent ) return $ ( a . offsetParent ); if (a == document . body ) return $ (a); for (;(a = a . parentNode ) && a != document . body ;) if ( Element . getStyle (a, " position " ) != " static " ) return $ (a); return $ ( document . body )},

viewportOffset : function ( a ){ var b = 0 ,c = 0 ,d = a; do {b = b + ( d . offsetTop || 0 );c = c + ( d . offsetLeft || 0 ); if ( d . offsetParent == document . body && Element . getStyle (d, " position " ) == " absolute " ) break } while (d = d . offsetParent );d = a; do if ( ! Prototype . Browser . Opera || d . tagName == " BODY " ){b = b - ( d . scrollTop || 0 );c = c - ( d . scrollLeft || 0 )} while (d = d . parentNode ); return Element . _returnOffset (c,b)}, clonePosition : function ( a , b , c ){ var c = Object . extend ({setLeft : true ,setTop : true ,setWidth : true ,setHeight : true ,offsetTop : 0 ,offsetLeft : 0 },c || {}),b = $ (b),d = b . viewportOffset (),

a = $ (a),e = [ 0 , 0 ],f = null ; if ( Element . getStyle (a, " position " ) == " absolute " ){f = a . getOffsetParent ();e = f . viewportOffset ()} if (f == document . body ){e[ 0 ] = e[ 0 ] - document . body . offsetLeft ;e[ 1 ] = e[ 1 ] - document . body . offsetTop } if ( c . setLeft ) a . style . left = d[ 0 ] - e[ 0 ] + c . offsetLeft + " px " ; if ( c . setTop ) a . style . top = d[ 1 ] - e[ 1 ] + c . offsetTop + " px " ; if ( c . setWidth ) a . style . width = b . offsetWidth + " px " ; if ( c . setHeight ) a . style . height = b . offsetHeight + " px " ; return a}}; Element . Methods . identify . counter = 1 ;

Object . extend ( Element . Methods ,{getElementsBySelector : Element . Methods . select ,childElements : Element . Methods . immediateDescendants }); Element . _attributeTranslations = {write : {names : {className : " class " ,htmlFor : " for " },values : {}}};

if ( ! document . createRange || Prototype . Browser . Opera ) Element . Methods . insert = function ( a , b ){a = $ (a); if ( Object . isString (b) || Object . isNumber (b) || Object . isElement (b) || b && ( b . toElement || b . toHTML ))b = {bottom : b}; var c = Element . _insertionTranslations ,d,e,f,g; for (e in b){d = b[e];e = e . toLowerCase ();f = c[e];d && d . toElement && (d = d . toElement ()); if ( Object . isElement (d)) f . insert (a,d); else {d = Object . toHTML (d);g = (e == " before " || e == " after " ? a . parentNode : a). tagName . toUpperCase (); if ( c . tags [g]){g = Element . _getContentFromAnonymousElement (g,

d . stripScripts ());(e == " top " || e == " after " ) && g . reverse (); g . each ( f . insert . curry (a))} else a . insertAdjacentHTML ( f . adjacency , d . stripScripts ()); d . evalScripts . bind (d). defer ()}} return a};

Prototype . Browser . Opera ? ( Element . Methods . _getStyle = Element . Methods . getStyle , Element . Methods . getStyle = function ( a , b ){ switch (b){ case " left " : case " top " : case " right " : case " bottom " : if ( Element . _getStyle (a, " position " ) == " static " ) return null ; default : return Element . _getStyle (a,b)}}, Element . Methods . _readAttribute = Element . Methods . readAttribute , Element . Methods . readAttribute = function ( a , b ){ return b == " title " ? a . title : Element . _readAttribute (a,b)}) : Prototype . Browser . IE ? ( $w ( " positionedOffset getOffsetParent viewportOffset " ). each ( function ( a ){ Element . Methods [a] =

Element . Methods [a]. wrap ( function ( a , c ){ var c = $ (c),d = c . getStyle ( " position " ); if (d != " static " ) return a (c); c . setStyle ({position : " relative " }); var e = a (c); c . setStyle ({position : d}); return e})}), Element . Methods . getStyle = function ( a , b ){ var a = $ (a),b = b == " float " || b == " cssFloat " ? " styleFloat " : b . camelize (),c = a . style [b]; ! c && a . currentStyle && (c = a . currentStyle [b]); return b == " opacity " ? (c = ( a . getStyle ( " filter " ) || " " ). match ( / alpha \( opacity=( . * ) \) / )) && c[ 1 ] ? parseFloat (c[ 1 ]) / 100 : 1 : c == " auto " ? (b == " width " || b == " height " ) && a . getStyle ( " display " ) !=

" none " ? a[ " offset " + b . capitalize ()] + " px " : null : c}, Element . Methods . setOpacity = function ( a , b ){ var a = $ (a),c = a . currentStyle ; if (c &&! c . hasLayout ||! c && a . style . zoom == " normal " ) a . style . zoom = 1 ; var c = a . getStyle ( " filter " ),d = a . style ; if (b == 1 || b === " " ){(c = c . replace ( / alpha \( [ ^ \) ] * \) / gi , " " )) ? d . filter = c : d . removeAttribute ( " filter " ); return a}b < 1E-5 && (b = 0 ); d . filter = c . replace ( / alpha \( [ ^ \) ] * \) / gi , " " ) + " alpha(opacity= " + b * 100 + " ) " ; return a}, Element . _attributeTranslations = {read : {names : { " class " : " className " , " for " : " htmlFor " },values : { _getAttr : function ( a ,

b ){ return a . getAttribute (b, 2 )}, _getAttrNode : function ( a , b ){ var c = a . getAttributeNode (b); return c ? c . value : " " }, _getEv : function ( a , b ){ return (b = a . getAttribute (b)) ? b . toString (). slice ( 23 , - 2 ) : null }, _flag : function ( a , b ){ return $ (a). hasAttribute (b) ? b : null }, style : function ( a ){ return a . style . cssText . toLowerCase ()}, title : function ( a ){ return a . title }}}}, Element . _attributeTranslations . write = {names : Object . clone ( Element . _attributeTranslations . read . names ),values : { checked : function ( a , b ){ a . checked = !! b}, style : function ( a , b ){ a . style . cssText =

b ? b : " " }}}, Element . _attributeTranslations . has = {}, $w ( " colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc " ). each ( function ( a ){ Element . _attributeTranslations . write . names [ a . toLowerCase ()] = a; Element . _attributeTranslations . has [ a . toLowerCase ()] = a}), function ( a ){ Object . extend (a,{href : a . _getAttr ,src : a . _getAttr ,type : a . _getAttr ,action : a . _getAttrNode ,disabled : a . _flag ,checked : a . _flag ,readonly : a . _flag ,multiple : a . _flag ,onload : a . _getEv ,onunload : a . _getEv ,onclick : a . _getEv ,ondblclick : a . _getEv ,

onmousedown : a . _getEv ,onmouseup : a . _getEv ,onmouseover : a . _getEv ,onmousemove : a . _getEv ,onmouseout : a . _getEv ,onfocus : a . _getEv ,onblur : a . _getEv ,onkeypress : a . _getEv ,onkeydown : a . _getEv ,onkeyup : a . _getEv ,onsubmit : a . _getEv ,onreset : a . _getEv ,onselect : a . _getEv ,onchange : a . _getEv })}( Element . _attributeTranslations . read . values )) : Prototype . Browser . Gecko && / rv:1 \. 8 \. 0 / . test ( navigator . userAgent ) ? Element . Methods . setOpacity = function ( a , b ){a = $ (a); a . style . opacity = b == 1 ? 0.999999 : b === " " ? " " : b < 1E-5 ? 0 : b; return a} : Prototype . Browser . WebKit &&

( Element . Methods . setOpacity = function ( a , b ){a = $ (a); a . style . opacity = b == 1 || b === " " ? " " : b < 1E-5 ? 0 : b; if (b == 1 ) if ( a . tagName == " IMG " && a . width ){ a . width ++ ; a . width -- } else try { var c = document . createTextNode ( " " ); a . appendChild (c); a . removeChild (c)} catch (d){} return a}, Element . Methods . cumulativeOffset = function ( a ){ var b = 0 ,c = 0 ; do {b = b + ( a . offsetTop || 0 );c = c + ( a . offsetLeft || 0 ); if ( a . offsetParent == document . body && Element . getStyle (a, " position " ) == " absolute " ) break ;a = a . offsetParent } while (a); return Element . _returnOffset (c,b)});

if ( Prototype . Browser . IE || Prototype . Browser . Opera ) Element . Methods . update = function ( a , b ){a = $ (a);b && b . toElement && (b = b . toElement ()); if ( Object . isElement (b)) return a . update (). insert (b); var b = Object . toHTML (b),c = a . tagName . toUpperCase (); if (c in Element . _insertionTranslations . tags ){ $A ( a . childNodes ). each ( function ( b ){ a . removeChild (b)}); Element . _getContentFromAnonymousElement (c, b . stripScripts ()). each ( function ( b ){ a . appendChild (b)})} else a . innerHTML = b . stripScripts (); b . evalScripts . bind (b). defer (); return a};

document . createElement ( " div " ). outerHTML && ( Element . Methods . replace = function ( a , b ){a = $ (a);b && b . toElement && (b = b . toElement ()); if ( Object . isElement (b)){ a . parentNode . replaceChild (b,a); return a} var b = Object . toHTML (b),c = a . parentNode ,d = c . tagName . toUpperCase (); if ( Element . _insertionTranslations . tags [d]){ var e = a . next (),d = Element . _getContentFromAnonymousElement (d, b . stripScripts ()); c . removeChild (a);e ? d . each ( function ( a ){ c . insertBefore (a,e)}) : d . each ( function ( a ){ c . appendChild (a)})} else a . outerHTML = b . stripScripts ();

b . evalScripts . bind (b). defer (); return a}); Element . _returnOffset = function ( a , b ){ var c = [a,b]; c . left = a; c . top = b; return c}; Element . _getContentFromAnonymousElement = function ( a , b ){ var c = new Element ( " div " ),d = Element . _insertionTranslations . tags [a]; c . innerHTML = d[ 0 ] + b + d[ 1 ];d[ 2 ]. times ( function (){c = c . firstChild }); return $A ( c . childNodes )};

Element . _insertionTranslations = {before : {adjacency : " beforeBegin " , insert : function ( a , b ){ a . parentNode . insertBefore (b,a)}, initializeRange : function ( a , b ){ b . setStartBefore (a)}},top : {adjacency : " afterBegin " , insert : function ( a , b ){ a . insertBefore (b, a . firstChild )}, initializeRange : function ( a , b ){ b . selectNodeContents (a); b . collapse ( true )}},bottom : {adjacency : " beforeEnd " , insert : function ( a , b ){ a . appendChild (b)}},after : {adjacency : " afterEnd " , insert : function ( a , b ){ a . parentNode . insertBefore (b, a . nextSibling )}, initializeRange : function ( a ,

b ){ b . setStartAfter (a)}},tags : { TABLE : [ " <table> " , " </table> " , 1 ], TBODY : [ " <table><tbody> " , " </tbody></table> " , 2 ], TR : [ " <table><tbody><tr> " , " </tr></tbody></table> " , 3 ], TD : [ " <table><tbody><tr><td> " , " </td></tr></tbody></table> " , 4 ], SELECT : [ " <select> " , " </select> " , 1 ]}};( function (){ this . bottom . initializeRange = this . top . initializeRange ; Object . extend ( this . tags ,{ THEAD : this . tags . TBODY , TFOOT : this . tags . TBODY , TH : this . tags . TD })}). call ( Element . _insertionTranslations );

Element . Methods . Simulated = { hasAttribute : function ( a , b ){ var b = Element . _attributeTranslations . has [b] || b,c = $ (a). getAttributeNode (b); return c && c . specified }}; Element . Methods . ByTag = {}; Object . extend ( Element , Element . Methods ); ! Prototype . BrowserFeatures . ElementExtensions && document . createElement ( " div " ). __proto__ && ( window . HTMLElement = {}, window . HTMLElement . prototype = document . createElement ( " div " ). __proto__ , Prototype . BrowserFeatures . ElementExtensions = ! 0 );

Element . extend = function (){ if ( Prototype . BrowserFeatures . SpecificElementExtensions ) return Prototype . K ; var a = {},b = Element . Methods . ByTag ,c = Object . extend ( function ( c ){ if ( ! c || c . _extendedByPrototype || c . nodeType != 1 || c == window ) return c; var e = Object . clone (a),f = c . tagName ,g;b[f] && Object . extend (e,b[f]); for (g in e){f = e[g]; Object . isFunction (f) &&! (g in c) && (c[g] = f . methodize ())} c . _extendedByPrototype = Prototype . emptyFunction ; return c},{ refresh : function (){ if ( ! Prototype . BrowserFeatures . ElementExtensions ){ Object . extend (a,

Element . Methods ); Object . extend (a, Element . Methods . Simulated )}}}); c . refresh (); return c}(); Element . hasAttribute = function ( a , b ){ return a . hasAttribute ? a . hasAttribute (b) : Element . Methods . Simulated . hasAttribute (a,b)};

Element . addMethods = function ( a ){ function b ( b ){b = b . toUpperCase (); Element . Methods . ByTag [b] || ( Element . Methods . ByTag [b] = {}); Object . extend ( Element . Methods . ByTag [b],a)}function c(a,b,c){var c=c||false,d;for(d in a){var e=a[d];if(Object.isFunction(e)&&(!c||!(d in b)))b[d]=e.methodize()}}function d(a){var b,c={OPTGROUP:"OptGroup",TEXTAREA:"TextArea",P:"Paragraph",FIELDSET:"FieldSet",UL:"UList",OL:"OList",DL:"DList",DIR:"Directory",H1:"Heading",H2:"Heading",H3:"Heading",H4:"Heading",H5:"Heading",H6:"Heading",

Q : " Quote " , INS : " Mod " , DEL : " Mod " , A : " Anchor " , IMG : " Image " , CAPTION : " TableCaption " , COL : " TableCol " , COLGROUP : " TableCol " , THEAD : " TableSection " , TFOOT : " TableSection " , TBODY : " TableSection " , TR : " TableRow " , TH : " TableCell " , TD : " TableCell " , FRAMESET : " FrameSet " , IFRAME : " IFrame " };c[a] && (b = " HTML " + c[a] + " Element " ); if ( window [b]) return window [b];b = " HTML " + a + " Element " ; if ( window [b]) return window [b];b = " HTML " + a . capitalize () + " Element " ; if ( window [b]) return window [b]; window [b] = {}; window [b]. prototype = document . createElement (a). __proto__ ;

return window [b]} var e = Prototype . BrowserFeatures ,f = Element . Methods . ByTag ; if ( ! a){ Object . extend (Form, Form . Methods ); Object . extend ( Form . Element , Form . Element . Methods ); Object . extend ( Element . Methods . ByTag ,{ FORM : Object . clone ( Form . Methods ), INPUT : Object . clone ( Form . Element . Methods ), SELECT : Object . clone ( Form . Element . Methods ), TEXTAREA : Object . clone ( Form . Element . Methods )})} if ( arguments . length == 2 ) var g = a,a = arguments [ 1 ];g ? Object . isArray (g) ? g . each (b) : b (g) : Object . extend ( Element . Methods ,a || {}); if ( e . ElementExtensions ){ c ( Element . Methods ,

HTMLElement . prototype ); c ( Element . Methods . Simulated , HTMLElement . prototype , true )} if ( e . SpecificElementExtensions ) for ( var h in Element . Methods . ByTag ){e = d (h); Object . isUndefined (e) || c (f[h], e . prototype )} Object . extend ( Element , Element . Methods ); delete Element . ByTag ; Element . extend . refresh && Element . extend . refresh (); Element . cache = {}};

document . viewport = { getDimensions : function (){ var a = {}; $w ( " width height " ). each ( function ( b ){ var c = b . capitalize ();a[b] = self[ " inner " + c] || document . documentElement [ " client " + c] || document . body [ " client " + c]}); return a}, getWidth : function (){ return this . getDimensions (). width }, getHeight : function (){ return this . getDimensions (). height }, getScrollOffsets : function (){ return Element . _returnOffset ( window . pageXOffset || document . documentElement . scrollLeft || document . body . scrollLeft , window . pageYOffset || document . documentElement . scrollTop ||

document . body . scrollTop )}};

var Selector = Class . create ({ initialize : function ( a ){ this . expression = a . strip (); this . compileMatcher ()}, compileMatcher : function (){ if ( Prototype . BrowserFeatures . XPath &&! / ( \[ [ \w -] *? : | :checked) / . test ( this . expression )) return this . compileXPathMatcher (); var a = this . expression ,b = Selector . patterns ,c = Selector . criteria ,d,e; if ( Selector . _cache [a]) this . matcher = Selector . _cache [a]; else { for ( this . matcher = [ " this.matcher = function(root) { " , " var r = root, h = Selector.handlers, c = false, n; " ];a && d != a && / \S / . test (a);){d = a;

for ( var f in b){e = b[f]; if (e = a . match (e)){ this . matcher . push ( Object . isFunction (c[f]) ? c[f](e) : ( new Template (c[f])). evaluate (e));a = a . replace (e[ 0 ], " " ); break }}} this . matcher . push ( " return h.unique(n);

} " ); eval ( this . matcher . join ( "

" )); Selector . _cache [ this . expression ] = this . matcher }}, compileXPathMatcher : function (){ var a = this . expression ,b = Selector . patterns ,c = Selector . xpath ,d,e; if ( Selector . _cache [a]) this . xpath = Selector . _cache [a]; else { for ( this . matcher = [ " .//* " ];a && d != a && / \S / . test (a);){d = a; for ( var f in b) if (e = a . match (b[f])){ this . matcher . push ( Object . isFunction (c[f]) ?

c[f](e) : ( new Template (c[f])). evaluate (e));a = a . replace (e[ 0 ], " " ); break }} this . xpath = this . matcher . join ( " " ); Selector . _cache [ this . expression ] = this . xpath }}, findElements : function ( a ){a = a || document ; return this . xpath ? document . _getElementsByXPath ( this . xpath ,a) : this . matcher (a)}, match : function ( a ){ this . tokens = []; for ( var b = this . expression ,c = Selector . patterns ,d = Selector . assertions ,e,f;b && e !== b && / \S / . test (b);){e = b; for ( var g in c){f = c[g]; if (f = b . match (f)) if (d[g]){ this . tokens . push ([g, Object . clone (f)]);b = b . replace (f[ 0 ],

" " )} else return this . findElements ( document ). include (a)}}b = true ; for (g = 0 ;d = this . tokens [g];g ++ ){c = d[ 0 ];d = d[ 1 ]; if ( ! Selector . assertions [c](a,d)){b = false ; break }} return b}, toString : function (){ return this . expression }, inspect : function (){ return " #<Selector: " + this . expression . inspect () + " > " }});

Object . extend (Selector,{_cache : {},xpath : {descendant : " //* " ,child : " /* " ,adjacent : " /following-sibling::*[1] " ,laterSibling : " /following-sibling::* " , tagName : function ( a ){ return a[ 1 ] == " * " ? " " : " [local-name()=' " + a[ 1 ]. toLowerCase () + " ' or local-name()=' " + a[ 1 ]. toUpperCase () + " '] " },className : " [contains(concat(' ', @class, ' '), ' #{1} ')] " ,id : " [@id='#{1}'] " ,attrPresence : " [@#{1}] " , attr : function ( a ){a[ 3 ] = a[ 5 ] || a[ 6 ]; return ( new Template ( Selector . xpath . operators [a[ 2 ]])). evaluate (a)}, pseudo : function ( a ){ var b = Selector . xpath . pseudos [a[ 1 ]];

return ! b ? " " : Object . isFunction (b) ? b (a) : ( new Template ( Selector . xpath . pseudos [a[ 1 ]])). evaluate (a)},operators : { " = " : " [@#{1}='#{3}'] " , " != " : " [@#{1}!='#{3}'] " , " ^= " : " [starts-with(@#{1}, '#{3}')] " , " $= " : " [substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}'] " , " *= " : " [contains(@#{1}, '#{3}')] " , " ~= " : " [contains(concat(' ', @#{1}, ' '), ' #{3} ')] " , " |= " : " [contains(concat('-', @#{1}, '-'), '-#{3}-')] " },pseudos : { " first-child " : " [not(preceding-sibling::*)] " , " last-child " : " [not(following-sibling::*)] " ,

" only-child " : " [not(preceding-sibling::* or following-sibling::*)] " ,empty : " [count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r

', '') = '')] " ,checked : " [@checked] " ,disabled : " [@disabled] " ,enabled : " [not(@disabled)] " , not : function ( a ){ for ( var b = a[ 6 ],c = Selector . patterns ,d = Selector . xpath ,e,f,g = [];b && e != b && / \S / . test (b);){e = b; for ( var h in c) if (a = b . match (c[h])){f = Object . isFunction (d[h]) ? d[h](a) : ( new Template (d[h])). evaluate (a); g . push ( " ( " + f . substring ( 1 , f . length - 1 ) + " ) " );b = b . replace (a[ 0 ], " " ); break }} return " [not( " +

g . join ( " and " ) + " )] " }, " nth-child " : function ( a ){ return Selector . xpath . pseudos . nth ( " (count(./preceding-sibling::*) + 1) " ,a)}, " nth-last-child " : function ( a ){ return Selector . xpath . pseudos . nth ( " (count(./following-sibling::*) + 1) " ,a)}, " nth-of-type " : function ( a ){ return Selector . xpath . pseudos . nth ( " position() " ,a)}, " nth-last-of-type " : function ( a ){ return Selector . xpath . pseudos . nth ( " (last() + 1 - position()) " ,a)}, " first-of-type " : function ( a ){a[ 6 ] = " 1 " ; return Selector . xpath . pseudos [ " nth-of-type " ](a)}, " last-of-type " : function ( a ){a[ 6 ] =

" 1 " ; return Selector . xpath . pseudos [ " nth-last-of-type " ](a)}, " only-of-type " : function ( a ){ var b = Selector . xpath . pseudos ; return b[ " first-of-type " ](a) + b[ " last-of-type " ](a)}, nth : function ( a , b ){ var c,d = b[ 6 ];d == " even " && (d = " 2n+0 " );d == " odd " && (d = " 2n+1 " ); if (c = d . match ( / ^ ( \d + ) $ / )) return " [ " + a + " = " + c[ 1 ] + " ] " ; if (c = d . match ( / ^ (- ? \d * ) ? n(( [+-] )( \d + )) ? / )){c[ 1 ] == " - " && (c[ 1 ] = - 1 );d = c[ 1 ] ? Number (c[ 1 ]) : 1 ;c = c[ 2 ] ? Number (c[ 2 ]) : 0 ; return ( new Template ( " [((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)] " )). evaluate ({fragment : a,

a : d,b : c})}}}},criteria : {tagName : ' n = h.tagName(n, r, "#{1}", c); c = false; ' ,className : ' n = h.className(n, r, "#{1}", c); c = false; ' ,id : ' n = h.id(n, r, "#{1}", c); c = false; ' ,attrPresence : ' n = h.attrPresence(n, r, "#{1}"); c = false; ' , attr : function ( a ){a[ 3 ] = a[ 5 ] || a[ 6 ]; return ( new Template ( ' n = h.attr(n, r, "#{1}", "#{3}", "#{2}"); c = false; ' )). evaluate (a)}, pseudo : function ( a ){a[ 6 ] && (a[ 6 ] = a[ 6 ]. replace ( / " / g , ' \\ " ' )); return ( new Template ( ' n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false; ' )). evaluate (a)},

descendant : ' c = "descendant"; ' ,child : ' c = "child"; ' ,adjacent : ' c = "adjacent"; ' ,laterSibling : ' c = "laterSibling"; ' },patterns : {laterSibling : / ^ \s * ~ \s * / ,child : / ^ \s * > \s * / ,adjacent : / ^ \s * \+ \s * / ,descendant : / ^ \s / ,tagName : / ^ \s * ( \* | [ \w \- ] + )( \b | $ ) ? / ,id : / ^ #( [ \w \- \* ] + )( \b | $ ) / ,className : / ^ \. ( [ \w \- \* ] + )( \b | $ ) / ,pseudo : / ^ :((first | last | nth | nth-last | only)(-child | -of-type) | empty | checked | (en | dis)abled | not)( \( ( . *? ) \) ) ? ( \b | $ | (?= \s ) | (?=:)) / ,attrPresence : / ^ \[ ( [ \w ] + ) \] / ,attr : / \[ ((?: [ \w -] * :) ? [ \w -] + ) \s * (?:( [!^$*~|] ? =) \s * (( ['"] )( [ ^ \4 ] *? ) \4 | ( [ ^ '"][ ^ \] ] *? ))) ? \] / },

assertions : { tagName : function ( a , b ){ return b[ 1 ]. toUpperCase () == a . tagName . toUpperCase ()}, className : function ( a , b ){ return Element . hasClassName (a,b[ 1 ])}, id : function ( a , b ){ return a . id === b[ 1 ]}, attrPresence : function ( a , b ){ return Element . hasAttribute (a,b[ 1 ])}, attr : function ( a , b ){ var c = Element . readAttribute (a,b[ 1 ]); return Selector . operators [b[ 2 ]](c,b[ 3 ])}},handlers : { concat : function ( a , b ){ for ( var c = 0 ,d;d = b[c];c ++ ) a . push (d); return a}, mark : function ( a ){ for ( var b = 0 ,c;c = a[b];b ++ ) c . _counted = true ; return a}, unmark : function ( a ){ for ( var b =

0 ,c;c = a[b];b ++ ) c . _counted = void 0 ; return a}, index : function ( a , b , c ){ a . _counted = true ; if (b) for ( var a = a . childNodes ,b = a . length - 1 ,d = 1 ;b >= 0 ;b -- ){ var e = a[b]; if ( e . nodeType == 1 && ( ! c || e . _counted )) e . nodeIndex = d ++ } else {b = 0 ;d = 1 ; for (a = a . childNodes ;e = a[b];b ++ ) if ( e . nodeType == 1 && ( ! c || e . _counted )) e . nodeIndex = d ++ }}, unique : function ( a ){ if ( a . length == 0 ) return a; for ( var b = [],c,d = 0 ,e = a . length ;d < e;d ++ ) if ( ! (c = a[d]). _counted ){ c . _counted = true ; b . push ( Element . extend (c))} return Selector . handlers . unmark (b)}, descendant : function ( a ){ for ( var b =

Selector . handlers ,c = 0 ,d = [],e;e = a[c];c ++ ) b . concat (d, e . getElementsByTagName ( " * " )); return d}, child : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ ) for ( var e = 0 ,f;f = d . childNodes [e];e ++ ) f . nodeType == 1 && f . tagName != " ! " && c . push (f); return c}, adjacent : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ )(d = this . nextElementSibling (d)) && c . push (d); return c}, laterSibling : function ( a ){ for ( var b = Selector . handlers ,c = 0 ,d = [],e;e = a[c];c ++ ) b . concat (d, Element . nextSiblings (e)); return d}, nextElementSibling : function ( a ){ for (;a = a . nextSibling ;) if ( a . nodeType ==

1 ) return a; return null }, previousElementSibling : function ( a ){ for (;a = a . previousSibling ;) if ( a . nodeType == 1 ) return a; return null }, tagName : function ( a , b , c , d ){ var c = c . toUpperCase (),e = [],f = Selector . handlers ; if (a){ if (d){ if (d == " descendant " ){ for (b = 0 ;d = a[b];b ++ ) f . concat (e, d . getElementsByTagName (c)); return e}a = this [d](a); if (c == " * " ) return a} for (b = 0 ;d = a[b];b ++ ) d . tagName . toUpperCase () == c && e . push (d); return e} return b . getElementsByTagName (c)}, id : function ( a , b , c , d ){ var c = $ (c),e = Selector . handlers ; if ( ! c) return []; if ( ! a &&

b == document ) return [c]; if (a){ if (d) if (d == " child " ) for (b = 0 ;d = a[b];b ++ ){ if ( c . parentNode == d) return [c]} else if (d == " descendant " ) for (b = 0 ;d = a[b];b ++ ){ if ( Element . descendantOf (c,d)) return [c]} else if (d == " adjacent " ) for (b = 0 ;d = a[b];b ++ ){ if ( Selector . handlers . previousElementSibling (c) == d) return [c]} else a = e[d](a); for (b = 0 ;d = a[b];b ++ ) if (d == c) return [c]; return []} return c && Element . descendantOf (c,b) ? [c] : []}, className : function ( a , b , c , d ){a && d && (a = this [d](a)); return Selector . handlers . byClassName (a,b,c)}, byClassName : function ( a ,

b , c ){a || (a = Selector . handlers . descendant ([b])); for ( var b = " " + c + " " ,d = 0 ,e = [],f,g;f = a[d];d ++ ){g = f . className ; g . length != 0 && (g == c || ( " " + g + " " ). include (b)) && e . push (f)} return e}, attrPresence : function ( a , b , c ){a || (a = b . getElementsByTagName ( " * " )); for ( var b = [],d = 0 ,e;e = a[d];d ++ ) Element . hasAttribute (e,c) && b . push (e); return b}, attr : function ( a , b , c , d , e ){a || (a = b . getElementsByTagName ( " * " )); for ( var b = Selector . operators [e],e = [],f = 0 ,g;g = a[f];f ++ ){ var h = Element . readAttribute (g,c);h !== null && b (h,d) && e . push (g)} return e}, pseudo : function ( a ,

b , c , d , e ){a && e && (a = this [e](a));a || (a = d . getElementsByTagName ( " * " )); return Selector . pseudos [b](a,c,d)}},pseudos : { " first-child " : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ ) Selector . handlers . previousElementSibling (d) || c . push (d); return c}, " last-child " : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ ) Selector . handlers . nextElementSibling (d) || c . push (d); return c}, " only-child " : function ( a ){ for ( var b = Selector . handlers ,c = 0 ,d = [],e;e = a[c];c ++ ) ! b . previousElementSibling (e) &&! b . nextElementSibling (e) && d . push (e); return d}, " nth-child " : function ( a ,

b , c ){ return Selector . pseudos . nth (a,b,c)}, " nth-last-child " : function ( a , b , c ){ return Selector . pseudos . nth (a,b,c, true )}, " nth-of-type " : function ( a , b , c ){ return Selector . pseudos . nth (a,b,c, false , true )}, " nth-last-of-type " : function ( a , b , c ){ return Selector . pseudos . nth (a,b,c, true , true )}, " first-of-type " : function ( a , b , c ){ return Selector . pseudos . nth (a, " 1 " ,c, false , true )}, " last-of-type " : function ( a , b , c ){ return Selector . pseudos . nth (a, " 1 " ,c, true , true )}, " only-of-type " : function ( a , b , c ){ var d = Selector . pseudos ; return d[ " last-of-type " ](d[ " first-of-type " ](a,

b,c),b,c)}, getIndices : function ( a , b , c ){ return a == 0 ? b > 0 ? [b] : [] : $R ( 1 ,c). inject ([], function ( c , e ){ 0 == (e - b) % a && (e - b) / a >= 0 && c . push (e); return c})}, nth : function ( a , b , c , d , e ){ if ( a . length == 0 ) return [];b == " even " && (b = " 2n+0 " );b == " odd " && (b = " 2n+1 " ); var c = Selector . handlers ,f = [],g = [],h; c . mark (a);h = 0 ; for ( var i;i = a[h];h ++ ) if ( ! i . parentNode . _counted ){ c . index ( i . parentNode ,d,e); g . push ( i . parentNode )} if ( b . match ( / ^ \d + $ / )){b = Number (b); for (h = 0 ;i = a[h];h ++ ) i . nodeIndex == b && f . push (i)} else if (h = b . match ( / ^ (- ? \d * ) ? n(( [+-] )( \d + )) ? / )){h[ 1 ] ==

" - " && (h[ 1 ] = - 1 );b = Selector . pseudos . getIndices (h[ 1 ] ? Number (h[ 1 ]) : 1 ,h[ 2 ] ? Number (h[ 2 ]) : 0 , a . length );h = 0 ; for (d = b . length ;i = a[h];h ++ ) for (e = 0 ;e < d;e ++ ) i . nodeIndex == b[e] && f . push (i)} c . unmark (a); c . unmark (g); return f}, empty : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ ) d . tagName == " ! " || d . firstChild &&! d . innerHTML . match ( / ^ \s * $ / ) || c . push (d); return c}, not : function ( a , b , c ){ var d = Selector . handlers ,b = ( new Selector (b)). findElements (c); d . mark (b); for ( var c = 0 ,e = [],f;f = a[c];c ++ ) f . _counted || e . push (f); d . unmark (b); return e}, enabled : function ( a ){ for ( var b =

0 ,c = [],d;d = a[b];b ++ ) d . disabled || c . push (d); return c}, disabled : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ ) d . disabled && c . push (d); return c}, checked : function ( a ){ for ( var b = 0 ,c = [],d;d = a[b];b ++ 