new and restructured javascript examples and documentation (JAL-816,
authorjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 5 Jul 2011 11:05:43 +0000 (12:05 +0100)
committerjprocter <jprocter@compbio.dundee.ac.uk>
Tue, 5 Jul 2011 11:05:43 +0000 (12:05 +0100)
JAL-621,
JAL-856,
JAL-859, JAL-862, JAL-433, JAL-469)

14 files changed:
examples/appletParameters.html
examples/applets.html
examples/embedded.html
examples/embeddedWJmol.html [new file with mode: 0644]
examples/formComplete.html
examples/jalviewLiteJs.html [new file with mode: 0644]
examples/javascript/jalview.js [new file with mode: 0644]
examples/javascript/jquery-1.4.4.min.js [new file with mode: 0644]
examples/javascript/jquery.blockUI.js [new file with mode: 0644]
examples/javascript/jquery.timer.js [new file with mode: 0644]
examples/javascript/jshashtable-2.1.js [new file with mode: 0644]
examples/javascriptLaunch.html [new file with mode: 0644]
examples/jmol/Jmol.js [new file with mode: 0644]
examples/linkedapplets_ng.html [new file with mode: 0644]

index 9a26f15..b578ef5 100644 (file)
@@ -3,7 +3,7 @@
 <!-- InstanceEndEditable --> \r<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="keywords" content="jalview,multiple,sequence,alignment,editor,viewer,java,download,barton group,protein,dna,das,distributed annotation system">\r<!-- InstanceBeginEditable name="head" --><!-- InstanceEndEditable --> \r<style type="text/css">\r<!--\rtd {\r     font-family: Geneva, Arial, Helvetica, sans-serif;\r     font-size: 12px;\r}\r.plain {\r    font-family: Verdana, Arial, Helvetica, sans-serif;\r    font-size: 14px;\r       text-decoration: none;\r}\r.plain:hover{\r background-color:#000000; color: #F2F2FF;\r}\r \r-->\r</style>\r\r<script language="JavaScript">\rfunction genHref()\r{\rvar s1 = "ml:ljvwr", s2 = "athpai.g", s3 = "ioe@leo ", href="";\rfor(i=0; i<8; i++)\r{href = href + s1.charAt(i) + s2.charAt(i) + s3.charAt(i);   }\rwindow.location=href;\r}\rfunction getEventTarget(e)\r{\rif(!e)\re = window.event;\rif(e.target)\rreturn e.target;\rreturn e.srcElement;\r}\r\r</script>\r</head>\r\r<body alink="#000000" vlink="#000000" link="#000000">\r<script type="text/javascript">\rvar gaJsHost = (("https:" == document.location.protocol) ? \r"https://ssl." : "http://www.");\rdocument.write(unescape("%3Cscript src='" + gaJsHost + \r"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));\r</script>\r<script type="text/javascript">\rtry{\rvar pageTracker = _gat._getTracker("UA-9060947-1");\rpageTracker._trackPageview();\r} catch(err) {}\r</script>\r<div align="left"> \r  <table width="805" height="100" cellpadding="5">\r    <tr>\r      <td background="../jalview.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.compbio.dundee.ac.uk" target="NEW"><img src="../uodc_r1_c1.gif" width="143" height="101" border="1"></a></td>\r    </tr>\r  </table>\r  <table width="805" border="0" cellpadding="5" cellspacing="5">\r    <tr> \r      <td width="183" valign="top" bgcolor="#F2F2FF" border="5"> \r       \r       <div align="center">\r          <table width="182" height="386" border="0" cellpadding="0" cellspacing="0">\r            <tr> \r              <td align="left" valign="middle"><a href="../index.html" class="plain">Home</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="../overview.html" class="plain">Overview</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="../download.html" class="plain">Download</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="applets.html" class="plain">Applet \r                Version</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="examples.html" class="plain">Screenshots</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="../faq.html" class="plain">FAQ</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="../documentList.html" class="plain">Documentation</a></td>\r            </tr>\r            <tr>\r              <td align="left" valign="middle" ><a href="../releaseHistory.html" class="plain">Release \r                history</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="../source/source.html" class="plain">Source \r                Code</a></td>\r            </tr>\r                   <tr> \r              <td align="left" valign="middle"><a href="../versions.html" class="plain">Development Version</a></td>\r            </tr>\r                   <tr> \r              <td align="left" valign="middle"><a href="../links.html" class="plain">Links</a></td>\r            </tr>\r            <tr> \r              <td align="left" valign="middle"><a href="http://www.jalview.org/mailman/listinfo/jalview-announce" class="plain" target="NEW">News \r                Mailing List</a></td>\r            </tr>\r            <tr>\r              <td align="left" valign="middle"><a\r            href="http://www.jalview.org/mailman/listinfo/jalview-discuss"\r            class="plain" target="NEW">Discussion Mailing List</a><br><br><em>Please send problems<br>and\r            bug reports to the discussion list.</em></td>\r            </tr>\r            <tr></tr>\r            <tr>\r              <!--<td align="left" valign="middle"><br>\r                Please send problems<br>and\r            bug reports to:<br><a href="#" onClick="javascript:genHref();"><img src="../help.gif" width="123" height="19" border="0"></a></td>-->\r            </tr>\r          </table>\r\r        </div>\r\r        <div align="center"> <a href="http://www.bbsrc.ac.uk/" target="NEW"><br>\r          <img src="../bbsrc-new.gif" width="179" height="64" border="1"></a> \r        </div>\r        </td>\r      <td valign="top" width="587" bgcolor="#F2F2FF"><!-- InstanceBeginEditable name="Contents" --> 
         <p><strong>Download the applet jar file from <a
         href="jalviewApplet.jar">here</a>. Parameters are described
-        <a href="#parameters">below</a>, and the javascript API is described <a href="formComplete.html">here</a></strong>.
+        <a href="#parameters">below</a>, and the javascript API is described <a href="jalviewLiteJs.html">here</a></strong>.
         </p>
         <h3 align="left">Useful to know!!</h3>
         <ul>
index eeb0d87..21ed203 100755 (executable)
@@ -15,7 +15,7 @@
         <p align="left">For more information on how to use the applet in your
           website, see <a href="appletParameters.html"><strong>full list of applet
           parameters.</strong></a></p>
-        <p> Pressing one of the buttons below will load up a cut down version
+        <p> Pressing one of the buttons below will load up JalviewLite, a cut down version
           of Jalview, which runs within your web browser. </p>
         <H4 align="center"> Ferredoxins, chloroplast precursor related UniRef50
           cluster<br>
@@ -82,8 +82,8 @@
                     <td width="100"> <applet code="jalview.bin.JalviewLite"
                                width="140" height="35"
                                archive="jalviewApplet.jar,JmolApplet-12.1.13.jar">
-                        <param name="file" value="uniref50.fa">
-                        <param name="defaultColour" value="Strand Propensity">
+                        <param name="file" value="uniref50.fa">\r                        <!-- <param name="debug" value="true">
+                        -->\r                        <param name="defaultColour" value="Strand Propensity">
                         <param name="wrap" value="true">
                         <param name="showAnnotation" value="false">
                         <param name="windowHeight" value="500">
                   </tr>
                 </table></td>
             </tr>
-          </table>
-        </div>
+          </table>\r          
+        </div>\r        <p>&nbsp;</p>\r          <p>For more JalviewLite examples, follow the links below.\r          <ul>\r          <li><a href="embedded.html">JalviewLite embedded in the web page</a></li>\r          <li><a href="formComplete.html">use Javascript to control and get data from JalviewLite</a></li>\r          <li><a href="linkedapplets_ng.html">use Javascript to make two jalviewLite instances talk to each other</a></li>\r          <li><a href="embeddedWJmol.html">configure JalviewLite to talk to a Jmol applet on the page.</a></li>\r          </ul>
         <!-- InstanceEndEditable --></td>\r    </tr>\r  </table>\r</div>\r</body>\r<!-- InstanceEnd --></html>\r
\ No newline at end of file
index 1339cf1..3f61c17 100644 (file)
@@ -15,7 +15,7 @@ Embedded viewing of Alignments
        Jalview Alignment Annotations File</li>\r
 </ul>\r
 <applet code="jalview.bin.JalviewLite"\r
-                       width="756" height="560" archive="../../jalviewApplet.jar">\r
+                       width="756" height="560" archive="jalviewApplet.jar">\r
                        <param name="file" value="plantfdx.fa">\r
                        <param name="annotations" value="plantfdx.annotations">\r
                        <param name="features" value="plantfdx.features">\r
diff --git a/examples/embeddedWJmol.html b/examples/embeddedWJmol.html
new file mode 100644 (file)
index 0000000..a8c803c
--- /dev/null
@@ -0,0 +1,242 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
+<html><!-- InstanceBegin template="/Templates/jtemplate.dwt" codeOutsideHTMLIsLocked="false" -->\r
+<head>\r
+<!-- InstanceBeginEditable name="doctitle" -->\r
+<TITLE>Embedded JalviewLite talking to externally managed Jmol</TITLE>\r
+<!-- InstanceEndEditable --> \r
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">\r
+<meta http-equiv="keywords" content="protein,interaction,domain,alignment,barton group,structure,interface">\r
+<!-- InstanceBeginEditable name="head" -->\r
+<script src="http://www.java.com/js/deployJava.js"></script>\r
+<script src="jmol/Jmol.js"></script>\r
+<script src="javascript/jquery-1.4.4.min.js"></script>\r
+<script src="javascript/jquery.timer.js"></script>\r
+<script src="javascript/jquery.blockUI.js"></script>\r
+<script src="javascript/jshashtable-2.1.js" language="javascript"></script>\r
+<!-- <script src="archive-min.js" language="javascript"></script>\r
+-->\r
+<script src="javascript/jalview.js" language="javascript"></script>\r
+<script language="JavaScript">\r
+// instead of this, we use a custom JmolApplet spec\r
+// jmolInitialize('jmol');\r
+jmolInitialize("","JmolApplet-12.1.13.jar");\r
+function genHref()\r
+{\r
+       var s1 = "ml:i@midd..", s2 = "atelcpoueau", s3 = "iomyob.neck", href="";\r
+       for(i=0; i<11; i++)\r
+       {       href = href + s1.charAt(i) + s2.charAt(i) + s3.charAt(i);       \r
+       }\r
+       window.location=href;\r
+}\r
+</script>\r
+<script>\r
+       var loglevel=1;\r
+       function dbg(lvl,string) {\r
+               if (_console && lvl<=loglevel) {_console.value += string + "\n";}\r
+       }\r
+       var _lastTime=new Date();\r
+       var _path;\r
+       var _datazip;\r
+       var _zip;\r
+       var alignA;\r
+       var alignB;\r
+       var featuresA;\r
+       var featuresB;\r
+       var pairs;\r
+       var atompairs;\r
+       var structdata;\r
+       var jmolview;\r
+       var jvstructassoc;\r
+       var modeltofiles = new Array();\r
+\r
+       function lJvA() {\r
+               jvfollower = document.getElementById("jvA");\r
+               setConsole(document.getElementById("stdout"));\r
+               \r
+               sep = jvfollower.getSeparator();\r
+               //jvapp.setSeparator(""+jvapp.getSeparator());\r
+               linkJvJmol(jvfollower, "jmolView", modeltofiles);\r
+       };\r
+\r
+       var _jvA=new Object();\r
+       _jvA.attributes = {\r
+               code : 'jalview.bin.JalviewLite',\r
+               archive : 'jalviewApplet.jar',\r
+               width : '100%',\r
+               height : '35%',\r
+               mayscript : 'True',\r
+               scriptable: 'True',\r
+               id : 'jvA'\r
+       };\r
+       _jvA.parameters = {\r
+                       java_arguments : "-Xmx256m",\r
+               externalstructureviewer : "true",\r
+         oninit : "lJvA",\r
+               automaticScrolling : "true",\r
+               defaultColour : "Strand Propensity",\r
+               file : "uniref50.fa",\r
+               \r
+               relaxedidmatch : "true",\r
+               debug : "true",\r
+               wrap : "false",\r
+               // separator : "^",\r
+               showAnnotation : "false",\r
+               embedded : "true",\r
+               showFullId : "false",\r
+               RGB : "F2F2FF",\r
+               linkLabel_1 : "SRS",\r
+               linkUrl_1 : "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[uniprot-all:$SEQUENCE_ID$]+-vn+2"\r
+               ,\r
+               linkLabel_2 : "Uniprot"\r
+               ,\r
+               linkUrl_2 : "http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID$",\r
+               APPLICATION_URL : "http://www.jalview.org/services/launchApp",\r
+               PDBfile : "1gaq.txt FER1_MAIZE"\r
+       };\r
+       jmolSetCallback("hoverCallback","_jmolhover");\r
+  jmolSetCallback("pickCallback","_jmolpick");\r
+  modeltofiles+="1gaq.txt";\r
+</script>\r
+<!-- InstanceEndEditable --> \r
+<style type="text/css">\r
+<!--\r
+td {\r
+  font-family: Geneva, Arial, Helvetica, sans-serif;\r
+  font-size: 12px;\r
+}\r
+.plain {\r
+  font-family: Verdana, Arial, Helvetica, sans-serif;\r
+  font-size: 14px;\r
+  text-decoration: none;\r
+}\r
+.plain:hover{\r
+  background-color:#000000; color: #F2F2FF;\r
+}\r
\r
+-->\r
+</style>\r
+<script language="JavaScript">\r
+function genHref()\r
+{\r
+var s1 = "ml:ljvwr", s2 = "athpai.g", s3 = "ioe@leo ", href="";\r
+for(i=0; i<8; i++)\r
+{href = href + s1.charAt(i) + s2.charAt(i) + s3.charAt(i);  }\r
+window.location=href;\r
+}\r
+function getEventTarget(e)\r
+{\r
+if(!e)\r
+e = window.event;\r
+if(e.target)\r
+return e.target;\r
+return e.srcElement;\r
+}\r
+</script>\r
+</head>\r
+<body alink="#000000" vlink="#000000" link="#000000">\r
+<script type="text/javascript">\r
+var gaJsHost = (("https:" == document.location.protocol) ? \r
+"https://ssl." : "http://www.");\r
+document.write(unescape("%3Cscript src='" + gaJsHost + \r
+"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));\r
+</script>\r
+<script type="text/javascript">\r
+try{\r
+var pageTracker = _gat._getTracker("UA-9060947-1");\r
+pageTracker._trackPageview();\r
+} catch(err) {}\r
+</script>\r
+<div align="left"> \r
+  <table width="805" height="100" cellpadding="5">\r
+    <tr>\r
+      <td background="../jalview.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.compbio.dundee.ac.uk" target="NEW"><img src="../uodc_r1_c1.gif" width="143" height="101" border="1"></a></td>\r
+    </tr>\r
+  </table>\r
+  <table width="805" border="0" cellpadding="5" cellspacing="5">\r
+    <tr> \r
+      <td width="183" valign="top" bgcolor="#F2F2FF" border="5"> \r
+    \r
+    <div align="center">\r
+          <table width="182" height="386" border="0" cellpadding="0" cellspacing="0">\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../index.html" class="plain">Home</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../overview.html" class="plain">Overview</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../download.html" class="plain">Download</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="applets.html" class="plain">Applet \r
+                Version</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="examples.html" class="plain">Screenshots</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../faq.html" class="plain">FAQ</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../documentList.html" class="plain">Documentation</a></td>\r
+            </tr>\r
+            <tr>\r
+              <td align="left" valign="middle" ><a href="../releaseHistory.html" class="plain">Release \r
+                history</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../source/source.html" class="plain">Source \r
+                Code</a></td>\r
+            </tr>\r
+      <tr> \r
+              <td align="left" valign="middle"><a href="../versions.html" class="plain">Development Version</a></td>\r
+            </tr>\r
+      <tr> \r
+              <td align="left" valign="middle"><a href="../links.html" class="plain">Links</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="http://www.jalview.org/mailman/listinfo/jalview-announce" class="plain" target="NEW">News \r
+                Mailing List</a></td>\r
+            </tr>\r
+            <tr>\r
+              <td align="left" valign="middle"><a\r
+            href="http://www.jalview.org/mailman/listinfo/jalview-discuss"\r
+            class="plain" target="NEW">Discussion Mailing List</a><br><br><em>Please send problems<br>and\r
+            bug reports to the discussion list.</em></td>\r
+            </tr>\r
+            <tr></tr>\r
+            <tr>\r
+              <!--<td align="left" valign="middle"><br>\r
+                Please send problems<br>and\r
+            bug reports to:<br><a href="#" onClick="javascript:genHref();"><img src="../help.gif" width="123" height="19" border="0"></a></td>-->\r
+            </tr>\r
+          </table>\r
+        </div>\r
+        <div align="center"> <a href="http://www.bbsrc.ac.uk/" target="NEW"><br>\r
+          <img src="../bbsrc-new.gif" width="179" height="64" border="1"></a> \r
+        </div>\r
+        </td>\r
+      <td valign="top" width="587" bgcolor="#F2F2FF"><!-- InstanceBeginEditable name="Contents" -->\r
+<!-- <a onclick="colourStructs();">Colour from jalviews</a>\r
+ -->\r
+    <script>\r
+       jmolApplet("500x500","zap; load FILE '1gaq.txt'; frame 0; select all; wireframe off; spacefill off; backbone 0.01; restrict; center *; set selectionhalos true;select 0","jmolView");\r
+</script>\r
+  <script>\r
+    deployJava.runApplet(_jvA.attributes, _jvA.parameters, '1.4');\r
+    </script>\r
+       \r
+       </td>\r
+       </tr>\r
+       </table>\r
+<form name="console" id="console">\r
+  <textarea name="output" id="stdout" rows="3" cols="80"\r
+  >Messages  will appear here.</textarea></form>\r
+       </div>\r
+        <!-- InstanceEndEditable --></td>\r
+    </tr>\r
+  </table>\r
+</div>\r
+</body>\r
+<!-- InstanceEnd --></html>\r
+       
\ No newline at end of file
index fb1d7de..5da0fbf 100644 (file)
@@ -127,11 +127,11 @@ pageTracker._trackPageview();
         </td>
       <td valign="top" width="587" bgcolor="#F2F2FF"><!-- InstanceBeginEditable name="Contents" -->
                <p>&nbsp;</p>
+               <strong>Using the <a href="jalviewLiteJs.html">JalviewLite API</a> to fill out forms using data from JalviewLite<br></strong>
                Click the Javascript buttons below to interact with the Applet
                instance on the page.<br>
-               View the source in your browser to see how it has been done.<br>
-               The applet's public API methods are <a href="#api">listed below</a>
-               the following example.<br>
+               View the source in your browser to see how it has been done. <br>
+               <a name="api">View the full <a href="jalviewLiteJs.html">JalviewLite API documentation</a>.</a>
                <applet code="jalview.bin.JalviewLite" width="140" height="35"
                        archive="jalviewApplet.jar" name="Jalview">
                        <param name="file" value="plantfdx.fa">
@@ -175,128 +175,8 @@ pageTracker._trackPageview();
                        onClick="document.applets.Jalview.setFeatureGroupState(document.forms.groupForm.groups.value, false)"
                        value="Hide groups" /></div>
                </form>
-               <p><a name="api" /> Since Jalview 2.5, the public methods listed
-               below are available to be called via Javascript.</p>
-               <p>Unfortunately Javascript - Java communication is not possible
-               using Internet Explorer or Opera on Macs. Please use Safari or
-               Firefox.</p>
-               <p>If more than one Jalview window is open, Jalview returns the
-               alignment in the active window, unless you provide an AlignFrame
-               object reference.</p>
-               <p>The alignment output format can be either Fasta, PFAM, Clustal,
-               MSF, PIR, or BLC.</p>
-               <p>When referring to the Jalview applet in javascript, you must
-               either give Jalview a name in the applet tag or use the applets index.</p>
-
-               <pre>//get list of IDs of selected sequences
-public String getSelectedSequences()
-
-// list of IDs of selected sequences terminated by sep or, if sep is null, '&#172;' (&amp;#172;)
-public String getSelectedSequences(sep)
-
-// get selected sequences as alignment as format with or without start-end suffix
-public String getSelectedSequencesAsAlignment(String format, boolean suffix)
-
-// get selected sequences as alignment from given view as format with or without start-end suffix
-public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, String format, boolean suffix)
-
-// get alignment as format
-public String getAlignment(String format)
-
-// get alignment as format with jalview 
-// start-end sequence suffix appended
-public String getAlignment(String format, String suffix)
-
-// get alignment displayed in alf as format
-public String getAlignmentFrom(AlignFrame alf, String format)
-
-// get alignment displayed in alf as format 
-// with jalview start-end sequence suffix appended
-public String getAlignmentFrom(AlignFrame alf, String format, String suffix)
-
-// add the given features or annotation to the current alignment
-public void loadAnnotation(String annotation)
-
-// add the given features or annotation to the given alignment view
-public void loadAnnotationFrom(AlignFrame alf, String annotation)
-
-// get the sequence features in the given format (Jalview or GFF)
-public String getFeatures(String format)
-
-// get the sequence features in alf in the given format (Jalview or GFF)
-public String getFeaturesFrom(AlignFrame alf, String format)
-
-// get current alignment's annotation as an annotation file
-public String getAnnotation()
-
-// get alignment view alf's annotation as an annotation file
-public String getAnnotationFrom(AlignFrame alf)
-
-// create a new view and return the alignFrame instance
-public AlignFrame newView()
-
-// create a new view named name and return the alignFrame instance
-public AlignFrame newView(String name)
-
-// create a new view on alf and return the alignFrame instance
-public AlignFrame newViewFrom(AlignFrame alf)
-
-// create a new view named name on alf 
-// and return the alignFrame instance
-public AlignFrame newViewFrom(AlignFrame alf, String name)
-
-// load a new alignment 
-public AlignFrame loadAlignment(String text, String title)
-
-// return separator separated list of feature groups 
-// on the current alignment
-public String getFeatureGroups()
-
-// return separator separated list of feature groups on alf
-public String getFeatureGroupsOn(AlignFrame alf)
-
-// return separator separated list of feature groups 
-// either visible or hidden
-public String getFeatureGroupsOfState(boolean state)
-
-// return separator separated list of feature groups 
-// either visible or hidden on alf
-public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean state)
-
-// set the separator separated list of feature groups as 
-// visible or hidden on the current alignment
-public void setFeatureGroupState(String groupList, boolean state)
-
-// set the separator separated list of feature groups 
-// as visible or hidden on alf
-public void setFeatureGroupStateOn(AlignFrame alf, String groupList, boolean state)
-
-// helper functions
-
-// convert list to a separator separated array
-public String arrayToSeparatorList(String[] list) 
-
-// get a string array from a list
-public String[] separatorListToArray(String list)
-
-// get the current separator
-public String getSeparator()
-
-// set the current separator
-public void setSeparator(String)
-
-//// JalviewLite global state methods and fields
-
-// return the build date as a string
-public static String getBuildDate() 
-
-// return the JalviewLite version as a string
-public static String getVersion()
-
-// debug flag - controls output to standard out
-public static boolean debug
-
-</pre> <!-- InstanceEndEditable --></td>
+               
+<!-- InstanceEndEditable --></td>
     </tr>
   </table>
 </div>
diff --git a/examples/jalviewLiteJs.html b/examples/jalviewLiteJs.html
new file mode 100644 (file)
index 0000000..434d1a7
--- /dev/null
@@ -0,0 +1,371 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html><!-- InstanceBegin template="/Templates/jtemplate.dwt" codeOutsideHTMLIsLocked="false" -->
+<head>
+<!-- InstanceBeginEditable name="doctitle" -->
+<TITLE>JalviewLite API documentation</TITLE>
+<!-- InstanceEndEditable --> 
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="keywords" content="jalview,multiple,sequence,alignment,editor,viewer,java,download,barton group,protein,dna,das,distributed annotation system">
+<!-- InstanceBeginEditable name="head" -->
+<!-- InstanceEndEditable --> 
+<style type="text/css">
+<!--
+td {
+       font-family: Geneva, Arial, Helvetica, sans-serif;
+       font-size: 12px;
+}
+.plain {
+       font-family: Verdana, Arial, Helvetica, sans-serif;
+       font-size: 14px;
+       text-decoration: none;
+}
+.plain:hover{
+       background-color:#000000; color: #F2F2FF;
+}
+-->
+</style>
+<script language="JavaScript">
+function genHref()
+{
+var s1 = "ml:ljvwr", s2 = "athpai.g", s3 = "ioe@leo ", href="";
+for(i=0; i<8; i++)
+{href = href + s1.charAt(i) + s2.charAt(i) + s3.charAt(i);     }
+window.location=href;
+}
+function getEventTarget(e)
+{
+if(!e)
+e = window.event;
+if(e.target)
+return e.target;
+return e.srcElement;
+}
+</script>
+</head>
+<body alink="#000000" vlink="#000000" link="#000000">
+<script type="text/javascript">
+var gaJsHost = (("https:" == document.location.protocol) ? 
+"https://ssl." : "http://www.");
+document.write(unescape("%3Cscript src='" + gaJsHost + 
+"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
+</script>
+<script type="text/javascript">
+try{
+var pageTracker = _gat._getTracker("UA-9060947-1");
+pageTracker._trackPageview();
+} catch(err) {}
+</script>
+<div align="left"> 
+  <table width="805" height="100" cellpadding="5">
+    <tr>
+      <td background="../jalview.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.compbio.dundee.ac.uk" target="NEW"><img src="../uodc_r1_c1.gif" width="143" height="101" border="1"></a></td>
+    </tr>
+  </table>
+  <table width="805" border="0" cellpadding="5" cellspacing="5">
+    <tr> 
+      <td width="183" valign="top" bgcolor="#F2F2FF" border="5"> 
+         
+         <div align="center">
+          <table width="182" height="386" border="0" cellpadding="0" cellspacing="0">
+            <tr> 
+              <td align="left" valign="middle"><a href="../index.html" class="plain">Home</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="../overview.html" class="plain">Overview</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="../download.html" class="plain">Download</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="applets.html" class="plain">Applet 
+                Version</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="examples.html" class="plain">Screenshots</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="../faq.html" class="plain">FAQ</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="../documentList.html" class="plain">Documentation</a></td>
+            </tr>
+            <tr>
+              <td align="left" valign="middle" ><a href="../releaseHistory.html" class="plain">Release 
+                history</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="../source/source.html" class="plain">Source 
+                Code</a></td>
+            </tr>
+                       <tr> 
+              <td align="left" valign="middle"><a href="../versions.html" class="plain">Development Version</a></td>
+            </tr>
+                       <tr> 
+              <td align="left" valign="middle"><a href="../links.html" class="plain">Links</a></td>
+            </tr>
+            <tr> 
+              <td align="left" valign="middle"><a href="http://www.jalview.org/mailman/listinfo/jalview-announce" class="plain" target="NEW">News 
+                Mailing List</a></td>
+            </tr>
+            <tr>
+              <td align="left" valign="middle"><a
+            href="http://www.jalview.org/mailman/listinfo/jalview-discuss"
+            class="plain" target="NEW">Discussion Mailing List</a><br><br><em>Please send problems<br>and
+            bug reports to the discussion list.</em></td>
+            </tr>
+            <tr></tr>
+            <tr>
+              <!--<td align="left" valign="middle"><br>
+                Please send problems<br>and
+            bug reports to:<br><a href="#" onClick="javascript:genHref();"><img src="../help.gif" width="123" height="19" border="0"></a></td>-->
+            </tr>
+          </table>
+        </div>
+        <div align="center"> <a href="http://www.bbsrc.ac.uk/" target="NEW"><br>
+          <img src="../bbsrc-new.gif" width="179" height="64" border="1"></a> 
+        </div>
+        </td>
+      <td valign="top" width="587" bgcolor="#F2F2FF"><!-- InstanceBeginEditable name="Contents" -->
+               <p>&nbsp;</p>
+               <strong>JalviewLite Javascript API<br></strong>
+               <p>The jalviewLite applet's application programming interface (API) includes two components. A <a href="javascript/jalview.js">JalviewLite Javascript Library</a> and the <a href="#api">public methods on the JalviewLite applet</a>.
+               <p>The best way to learn how to use the API is to see it in action on the demonstration pages below:</p>
+               <ul>
+          <li><a href="formComplete.html">use Javascript to control and get data from JalviewLite</a></li>
+          <li><a href="linkedapplets_ng.html">use Javascript to make two jalviewLite instances talk to each other.</a></li>
+          <li><a href="embeddedWJmol.html">configure JalviewLite to talk to a Jmol applet on the page (EXPERIMENTAL! please provide feedback!).</a></li>
+          <li><a href="javascriptLaunch.html">launch JalviewLite from a javascript button</a></li>
+          
+               </ul>
+               <h4>Notes</h4>
+               <ul>
+               <li>Unfortunately Javascript - Java communication is not possible
+               using Internet Explorer or Opera on Macs. Please use Safari or
+               Firefox.</li>
+               <li>If more than one Jalview window is open, Jalview returns the
+               alignment in the active window, unless you provide an AlignFrame
+               object reference.</li>
+               <li>The alignment output format can be either Fasta, PFAM, Clustal,
+               MSF, PIR, or BLC.</li>
+               <li>When referring to the Jalview applet in javascript, you must
+               either give Jalview a name in the applet tag or use the document.applets index.</li>
+               <li>When creating javascript functions that are called by jalviewLite (e.g. the <em>oninit</em> parameter, or any mouseOver, selection or structureListener handlers), ensure they complete very quickly, and do not access any jalview API methods that might result in more javascript calls (this which will cause your browser to hang). If you need to do this, we suggest that jalviewLite callbacks are used to add new javascript events to a queue (e.g. using a Jquery timer callback) to avoid any concurrency issues.
+               </li>
+               </ul>
+               <a name="api">
+               <h4>JalviewLite's Java API</h4></a>
+               <p>The following public methods on the jalviewLite applet are available to be called from javascript:</p>
+               <pre>//get list of IDs of selected sequences
+public String getSelectedSequences()
+
+// list of IDs of selected sequences terminated by sep or, if sep is null, '&#172;' (&amp;#172;)
+public String getSelectedSequences(sep)
+
+// get list of selected sequences from specific alignFrame. (2.7)
+public String getSelectedSequencesFrom(AlignFrame alf)
+public String getSelectedSequencesFrom(AlignFrame alf, String sep)
+
+// highlight a position in a specific sequence or a column in an alignment containing it
+// provide ID sequence to highlight, integer (range highlighting will be supported in future versions)
+// and flag indicating if position is an alignment column or given according to sequence numbering (2.7)
+public void highlight(String sequenceId, String position, String alignedPosition)
+public void highlightIn(AlignFrame alf, String sequenceId, String position, String alignedPosition)
+
+
+// select regions of the currrent alignment frame using a list of sequence ids and a list of 
+// column numbers and ranges (with minus sign indicating start-end) (separated by default separator) (2.7) 
+public void select(String sequenceIds, String columns)
+public void select(String sequenceIds, String columns, String sep)
+public void selectIn(AlignFrame alf, String sequenceIds, String columns)
+public void selectIn(AlignFrame alf, String sequenceIds, String columns, String sep)
+
+
+// get selected sequences as alignment as format with or without start-end suffix
+public String getSelectedSequencesAsAlignment(String format, boolean suffix)
+
+// get selected sequences as alignment from given view as format with or without start-end suffix
+public String getSelectedSequencesAsAlignmentFrom(AlignFrame alf, String format, boolean suffix)
+
+// get a separator separated list of sequence IDs reflecting the order of the current alignment (2.7)
+public String getAlignmentOrder();
+public String getAlignmentOrderFrom(AlignFrame alf);
+public String getAlignmentOrderFrom(AlignFrame alf, String sep);
+
+// re-order the current alignment using the given list of sequence IDs separated by sep
+// undoName - is string to use when referring to ordering action in undo buffer
+// returns 'true' if alignment was actually reordered. empty string if alignment did not contain sequences.
+// (v2.7)
+public String orderBy(String order, String undoName)
+public String orderBy(String order, String undoName, String sep)
+String orderAlignmentBy(AlignFrame alf, String order, String undoName, String sep)
+
+
+// get alignment as format
+public String getAlignment(String format)
+
+// get alignment as format with jalview 
+// start-end sequence suffix appended
+public String getAlignment(String format, String suffix)
+
+// get alignment displayed in alf as format
+public String getAlignmentFrom(AlignFrame alf, String format)
+
+// get alignment displayed in alf as format 
+// with jalview start-end sequence suffix appended
+public String getAlignmentFrom(AlignFrame alf, String format, String suffix)
+
+// add the given features or annotation to the current alignment
+public void loadAnnotation(String annotation)
+
+// add the given features or annotation to the given alignment view
+public void loadAnnotationFrom(AlignFrame alf, String annotation)
+
+// get the sequence features in the given format (Jalview or GFF)
+public String getFeatures(String format)
+
+// get the sequence features in alf in the given format (Jalview or GFF)
+public String getFeaturesFrom(AlignFrame alf, String format)
+
+// get current alignment's annotation as an annotation file
+public String getAnnotation()
+
+// get alignment view alf's annotation as an annotation file
+public String getAnnotationFrom(AlignFrame alf)
+
+// create a new view and return the alignFrame instance
+public AlignFrame newView()
+
+// create a new view named name and return the alignFrame instance
+public AlignFrame newView(String name)
+
+// create a new view on alf and return the alignFrame instance
+public AlignFrame newViewFrom(AlignFrame alf)
+
+// create a new view named name on alf 
+// and return the alignFrame instance
+public AlignFrame newViewFrom(AlignFrame alf, String name)
+
+// load a new alignment 
+public AlignFrame loadAlignment(String text, String title)
+
+
+// register a javascript function to handle any alignment mouseover events
+// listener is name of javascript function  which will be called
+// with arguments [jalview.appletgui.AlignFrame,String(sequence id),
+// String(column in alignment), String(position in sequence)]
+// (v2.7)
+public void setMouseoverListener(String listener)
+
+// register a javascript function to handle mouseover events for specific alignframe
+// (v2.7)
+public void setMouseoverListener(AlignFrame af, String listener)
+
+// register a javascript function to handle alignment selection events. 
+// Events are generated when the user completes a selection event, or when
+// the user deselects all selected regions.
+// listener is name of javascript function  that will be called with arguments
+//  [jalview.appletgui.AlignFrame, String(sequence set id), 
+//   String(separator separated list of sequences which were selected), 
+//   String(separator separated list of column ranges)]
+// (v2.7)
+public void setSelectionListener(String listener)
+
+// register a selection listener for a specific alignment frame
+// (v2.7)
+public void setSelectionListener(AlignFrame af, String listener)
+
+// register a javascript function to handle events normally routed 
+// to a Jmol structure viewer.
+// listener is a javascript function called with several different types 
+// of arguments, dependent on the type of structure callback event. 
+// See jalview.javascript.MouseOverStructureListener for full details or
+// the embedded Jmol example.
+// modelSet - is a separator separated list of PDB file URIs that this viewer is handling (where position in list equals model number in Jmol).
+// (v2.7)
+public void setStructureListener(String listener, String modelSet)
+
+// remove any callback using the given listener function and associated with
+// the given alignFrame (or null for all callbacks) (v2.7)
+public void removeJavascriptListener(AlignFrame af, String listener)
+
+// send a mouseover message to all the alignment windows associated with the
+// given residue in the pdbfile (v2.7)
+public void mouseOverStructure(String pdbResNum, String chain, String pdbfile)
+
+// bind a pdb file to a sequence in the given alignFrame - this will be searched
+// for sequences matching sequenceId. The PDB file in pdbFile is either the contents
+// of a PDB file or a URI that can be used to retrieve the file, and the pdbEntryString
+// is the user friendly name (or PDBID) shown in jalview's user interface.
+// returns true if binding was as success (v2.7)
+public boolean addPdbFile(AlignFrame alFrame, 
+    String sequenceId, String pdbEntryString, String pdbFile)
+
+// adjust horizontal/vertical scroll in alf to the make 
+// the given location the top left hand corner for given current view (v2.7)
+public void scrollViewToIn(AlignFrame alf, String topRow, String leftHandColumn)
+
+
+// return separator separated list of feature groups 
+// on the current alignment
+public String getFeatureGroups()
+
+// return separator separated list of feature groups on alf
+public String getFeatureGroupsOn(AlignFrame alf)
+
+// return separator separated list of feature groups 
+// either visible or hidden
+public String getFeatureGroupsOfState(boolean state)
+
+// return separator separated list of feature groups 
+// either visible or hidden on alf
+public String getFeatureGroupsOfStateOn(AlignFrame alf, boolean state)
+
+// set the separator separated list of feature groups as 
+// visible or hidden on the current alignment
+public void setFeatureGroupState(String groupList, boolean state)
+
+// set the separator separated list of feature groups 
+// as visible or hidden on alf
+public void setFeatureGroupStateOn(AlignFrame alf, String groupList, boolean state)
+
+// helper functions
+
+// Asynchronously retrieve next chunk of a large packet of data made available 
+// for a JalviewLite event handler, or the empty string if no more data is available.
+// messageclass and viewId are keys used to retrieve a specific message related
+// to an event.  
+// Use this in a javascript timer or GUI update thread to retrieve data without 
+// blocking the JalviewLite applet. DO NOT USE IN THE CALLBACK THAT HANDLED THE EVENT
+// (v2.7)
+public String getJsMessage(String messageclass, String viewId)
+
+
+// convert list to a separator separated array
+public String arrayToSeparatorList(String[] list) 
+
+// get a string array from a list
+public String[] separatorListToArray(String list)
+
+// get the current separator
+public String getSeparator()
+
+// set the current separator
+public void setSeparator(String)
+
+//// JalviewLite global state methods and fields
+
+// return the build date as a string
+public static String getBuildDate() 
+
+// return the JalviewLite version as a string
+public static String getVersion()
+
+// debug flag - controls output to standard out
+public static boolean debug
+
+</pre> <!-- InstanceEndEditable --></td>
+    </tr>
+  </table>
+</div>
+</body>
+<!-- InstanceEnd --></html>
diff --git a/examples/javascript/jalview.js b/examples/javascript/jalview.js
new file mode 100644 (file)
index 0000000..4cc613e
--- /dev/null
@@ -0,0 +1,305 @@
+// default console to report messages\r
+var _console = document.getElementById("stdout");\r
+var _jvapps = new Array();\r
+// jvjmols is a list associating a jmol id to { modelstofiles }\r
+var _jvjmols = new Hashtable();\r
+// array of model names used to lookup index in Jmol\r
+var _modeltofiles = new Array();\r
+// counter for jmol structures\r
+var mnum = 1;\r
+\r
+function setConsole(console) {\r
+       _console = console;\r
+}\r
+\r
+function getDestinationFrms(source, frames) {\r
+       var frms = new Array();\r
+       var frid = "";\r
+       for (frm in frames) {\r
+               try {\r
+                       frid = (("" + source.getDatasetId()) == ("" + frames[frm]\r
+                                       .getDatasetId()));\r
+               } catch (q) {\r
+               }\r
+               ;\r
+               if (!frames[frm].equals(source) && !frid\r
+                               && !frames[frm].currentAlignFrame.equals(source)) {\r
+                       frms[frms.length] = frames[frm];\r
+               }\r
+       }\r
+       return frms;\r
+}\r
+\r
+function mouseover(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : "\r
+                       + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n";\r
+\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+\r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].highlight(list[1], list[2], "true");\r
+       }\r
+       return true;\r
+}\r
+\r
+function sellist(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : "\r
+                       + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n";\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+       \r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].selectIn(flist[follower].getDefaultTargetFrame(),\r
+                               list[2], list[3])\r
+       }\r
+       return true;\r
+}\r
+\r
+function viewlist(list1, list2, list3, list4) {\r
+       // list1 = new Object(list1);\r
+       var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4));\r
+       var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0]\r
+                       + " id : " + list[1] + "\nRow from " + list[2] + " and to "\r
+                       + list[3] + "\nVisible columns: " + list[4] + "\n";\r
+       var flist = getDestinationFrms(list1, _jvapps);\r
+       if (_console) {\r
+               _console.value = msg + "\n";\r
+       }\r
+\r
+       for (follower in flist) {\r
+               if (_console) {\r
+                       _console.value += "Sending to " + flist[follower] + "\n";\r
+               }\r
+               flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(),\r
+                               list[2], "-1");\r
+       }\r
+       return true;\r
+}\r
+\r
+// register a jalview applet and add some handlers to it\r
+// jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array\r
+function linkJvJmol(applet, jmolView, modeltofiles) {\r
+       var i = _jvapps.length;\r
+       while (i--) {\r
+               if (_jvapps[i].equals(applet)) {\r
+                       throw ("Ignoring additional linkJvJmol call for "\r
+                                       + applet.getName() + ".");\r
+               }\r
+       }\r
+       _jvapps[_jvapps.length] = applet;\r
+       applet.setMouseoverListener("mouseover");\r
+       applet.setSelectionListener("sellist");\r
+       // viewListener not fully implemented in 2.7\r
+       // try { applet.setViewListener("viewlist"); } catch (err) {};\r
+       if (jmolView)\r
+       {\r
+               var oldjm=jmolView;\r
+               // recover full id of Jmol applet\r
+               jmolView=_jmolGetApplet(jmolView).id;\r
+               var jmbinding=_jvjmols.get(jmolView);\r
+               if (!jmbinding)\r
+               {       \r
+                       jmbinding=new Object();\r
+                       jmbinding._modelstofiles=new Array();\r
+                       jmbinding._fullmpath=new Array();\r
+                       jmbinding._filetonum=new Hashtable();\r
+                       jmbinding._jmol=jmolView;\r
+                       jmbinding._jmhandle=oldjm;\r
+                       _jvjmols.put(jmolView,jmbinding);\r
+               }\r
+               \r
+               jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles);\r
+               jmbinding._jmol=jmolView;\r
+               // now update structureListener list\r
+               mtf="";\r
+               var dbase = document.baseURI.substring(0,document.baseURI.lastIndexOf("/")+1);\r
+               for (m in jmbinding._modelstofiles)\r
+               { mtf+=jmbinding._modelstofiles[m];\r
+               if (jmbinding._modelstofiles[m].indexOf("//")==-1)\r
+                       { jmbinding._fullmpath[m] = dbase+jmbinding._modelstofiles[m]; }\r
+                 jmbinding._filetonum.put(jmbinding._modelstofiles[m], m);\r
+                 jmbinding._filetonum.put(jmbinding._fullmpath[m], m);\r
+                 \r
+                 if (m>0) { mtf+=sep; }}\r
+               jvfollower.setStructureListener("_structure", mtf);\r
+       }\r
+}\r
+\r
+/*function _addJmolModel(jmolid, modelname) {\r
+       modelname=""+modelname;\r
+       var jminf = _jvjmols[jmolid];\r
+       if (!jminf) {\r
+               jminf = new Object();\r
+               jminf._modelstofiles = new Array(); //new Hashtable();\r
+               jminf._jmol = jmolid;\r
+               jminf._modellist=new Array();\r
+               _jvjmols[jmolid] = jminf;\r
+       }\r
+       var obj = new Object();\r
+       jminf._modeltofiles[modelname] = obj; // .put(modelname, obj);\r
+       obj.id = modelname;\r
+       obj.mnum = jminf._modeltofiles.length;\r
+       jminf._modellist+=modelname;\r
+}*/\r
+\r
+\r
+\r
+// jmol Jalview Methods\r
+\r
+function _structure(list1, list2, list3, list4) {\r
+       var follower;\r
+       // if (_console) { if (!_console.value) { _console.value="";} }\r
+       if (list1 == "mouseover") {\r
+               var list = new Array(("" + list1), ("" + list2), ("" + list3),\r
+                               ("" + list4));\r
+               // 1 is pdb file, 2 is residue number, 3 is chain\r
+               // list1 = new Object(list1);\r
+               var base = list[1].indexOf(document.baseURI\r
+                               .substring(0, document.baseURI.lastIndexOf('/'))\r
+                               ); // .indexOf(_path);\r
+               if (base==0) { base = document.baseURI.lastIndexOf('/'); }\r
+               var sid = list[1]; // .substring(base);\r
+               base = list[1].substring(0, base);\r
+               if (_console) {\r
+                       _console.value += "Model is " + list[1] + ", Structure id is : "\r
+                                       + sid + "\n";\r
+               }\r
+               ;\r
+               var siddat;\r
+               for ( var jmolappi in _jvjmols.values()) {\r
+                       var jmolapp=_jvjmols.values()[jmolappi];\r
+                       var msg = "";\r
+                       if (siddat = jmolapp._filetonum.get(sid)) {\r
+                               // we don't putin chain number because there isn't one ?\r
+                               // skip select 0 bit\r
+                               var ch = ""+list[3];\r
+                               if ((""+list[2]).trim().length==1)\r
+                                       {\r
+                                       ch+=":"+list[2];\r
+                                       }\r
+                               msg = "select (" + ch + " /" + siddat + ") ;";\r
+                       }\r
+                       if (msg) {\r
+                               if (_console) {\r
+                                       _console.value += "Sending '" + msg + "' to jmol." + "\n";\r
+                               }\r
+                       }\r
+                       jmolScriptWait(msg, "" + jmolapp._jmhandle);\r
+                       // only do highlight for one jmol ?\r
+                       // return 1;\r
+               }\r
+       }\r
+       if (list1 == "colourstruct") {\r
+               if (_console) {\r
+                       _console.value += 'colourStruct("' + list1 + '","' + list2\r
+                       + '") [' + list4 + ']' + "\n";\r
+               }\r
+               setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1);\r
+               return 1;\r
+       }\r
+       return 1;\r
+}\r
+// last colour message\r
+var _lastMsg = "";\r
+// indicator - if _colourStruct==0 then no colouring is going on\r
+var _colourStruct = 0;\r
+\r
+function colourStruct(involves, msg, handle) {\r
+       if (_colourStruct == 0) {\r
+               _colourStruct = 1;\r
+               for (ap in _jvapps) {\r
+                       var _msg = "";\r
+                       do {\r
+                               if (_msg.match(/\S/)) {\r
+                                       _lastMsg += _msg;\r
+                               }\r
+                               _msg = "" + _jvapps[ap].getJsMessage(msg, handle);\r
+                       } while (_msg.match(/\S/));\r
+               }\r
+               // locate the jmol that should get the message\r
+               for (var jmol in _jvjmols.values())\r
+                       {\r
+                       var jml=_jvjmols.values()[jmol];\r
+                       if (jml._filetonum.get(involves))\r
+                               {\r
+                                       colourStructs(jml._jmhandle);\r
+                               }\r
+                       }\r
+               _colourStruct = 0;\r
+       } else {\r
+               // setTimeout('colourStruct("'+msg+'","'+handle+'")',3);\r
+       }\r
+}\r
+\r
+function colourStructs(jmolapp) {\r
+       dbg(0, "Colouring the structures\n");\r
+       jmolScriptWait("set selectionhalos false;" + _lastMsg\r
+                       + "; select 0; set selectionhalos true;", jmolapp);\r
+       _lastMsg = "";\r
+}\r
+var _jmolhovermsg="";\r
+function _jmolhover(jmid, atomlabel, atomidx) {\r
+       var msg=""+jmid+" "+atomlabel+" "+atomidx;\r
+       if (_jmolhovermsg==msg)\r
+               {\r
+               return;\r
+               }\r
+       _jmolhovermsg=msg;\r
+       modeltofiles = _jvjmols.get(jmid)._modelstofiles;\r
+       // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/);\r
+       // relaxed third parameter - may be null or a model number for multi model\r
+       // views\r
+       atomlabel = ("" + atomlabel)\r
+                       .match(/\[(.+)\](\d+):(.)\.(\S+)\s*(\/\d+\.|).+/);\r
+       atomidx = "" + atomidx;\r
+       if (atomlabel[5]) {\r
+               atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1];\r
+       } else {\r
+               // default - first model\r
+               atomlabel[5] = 0;\r
+       }\r
+       // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews\r
+       for (ap in _jvapps) {\r
+               _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3],\r
+                               document.baseURI\r
+                                               .substring(0, document.baseURI.lastIndexOf('/'))\r
+                                               + "/" + modeltofiles[atomlabel[5]]);\r
+               msg = _jmolhovermsg;\r
+       }\r
+}\r
+function _jmolpick(jmid, atomlabel, atomidx) {\r
+       atomlabel = "" + atomlabel;\r
+       atomidx = "" + atomidx;\r
+       // label is atom id, atom number, and xyz coordinates in the form:\r
+       // C6 #6 -0.30683374 -1.6836332 -0.716934\r
+       // atom index, starting with 0.\r
+\r
+}\r
+function _jmolMessagecallback(jmid, statmess) {\r
+       // if (statmess.indexOf("Script Terminated")==0)\r
+       {\r
+               var thisTime = new Date();\r
+               if (_console) {\r
+                       _console.value += "Last script execution took : "\r
+                                       + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0\r
+                                       + " seconds.";\r
+               }\r
+               _lastTime = thisTime;\r
+\r
+       }\r
+}\r
diff --git a/examples/javascript/jquery-1.4.4.min.js b/examples/javascript/jquery-1.4.4.min.js
new file mode 100644 (file)
index 0000000..8f3ca2e
--- /dev/null
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+\-]*)\))?/,
+POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/examples/javascript/jquery.blockUI.js b/examples/javascript/jquery.blockUI.js
new file mode 100644 (file)
index 0000000..502a2e8
--- /dev/null
@@ -0,0 +1,490 @@
+\feff/*!
+ * jQuery blockUI plugin
+ * Version 2.37 (29-JAN-2011)
+ * @requires jQuery v1.2.3 or later
+ *
+ * Examples at: http://malsup.com/jquery/block/
+ * Copyright (c) 2007-2010 M. Alsup
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Thanks to Amir-Hossein Sobhi for some excellent contributions!
+ */
+
+;(function($) {
+
+if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) {
+       alert('blockUI requires jQuery v1.2.3 or later!  You are using v' + $.fn.jquery);
+       return;
+}
+
+$.fn._fadeIn = $.fn.fadeIn;
+
+var noOp = function() {};
+
+// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle
+// retarded userAgent strings on Vista)
+var mode = document.documentMode || 0;
+var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8);
+var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode;
+
+// global $ methods for blocking/unblocking the entire page
+$.blockUI   = function(opts) { install(window, opts); };
+$.unblockUI = function(opts) { remove(window, opts); };
+
+// convenience method for quick growl-like notifications  (http://www.google.com/search?q=growl)
+$.growlUI = function(title, message, timeout, onClose) {
+       var $m = $('<div class="growlUI"></div>');
+       if (title) $m.append('<h1>'+title+'</h1>');
+       if (message) $m.append('<h2>'+message+'</h2>');
+       if (timeout == undefined) timeout = 3000;
+       $.blockUI({
+               message: $m, fadeIn: 700, fadeOut: 1000, centerY: false,
+               timeout: timeout, showOverlay: false,
+               onUnblock: onClose, 
+               css: $.blockUI.defaults.growlCSS
+       });
+};
+
+// plugin method for blocking element content
+$.fn.block = function(opts) {
+       return this.unblock({ fadeOut: 0 }).each(function() {
+               if ($.css(this,'position') == 'static')
+                       this.style.position = 'relative';
+               if ($.browser.msie)
+                       this.style.zoom = 1; // force 'hasLayout'
+               install(this, opts);
+       });
+};
+
+// plugin method for unblocking element content
+$.fn.unblock = function(opts) {
+       return this.each(function() {
+               remove(this, opts);
+       });
+};
+
+$.blockUI.version = 2.37; // 2nd generation blocking at no extra cost!
+
+// override these in your code to change the default behavior and style
+$.blockUI.defaults = {
+       // message displayed when blocking (use null for no message)
+       message:  '<h1>Please wait...</h1>',
+
+       title: null,      // title string; only used when theme == true
+       draggable: true,  // only used when theme == true (requires jquery-ui.js to be loaded)
+       
+       theme: false, // set to true to use with jQuery UI themes
+       
+       // styles for the message when blocking; if you wish to disable
+       // these and use an external stylesheet then do this in your code:
+       // $.blockUI.defaults.css = {};
+       css: {
+               padding:        0,
+               margin:         0,
+               width:          '30%',
+               top:            '40%',
+               left:           '35%',
+               textAlign:      'center',
+               color:          '#000',
+               border:         '3px solid #aaa',
+               backgroundColor:'#fff',
+               cursor:         'wait'
+       },
+       
+       // minimal style set used when themes are used
+       themedCSS: {
+               width:  '30%',
+               top:    '40%',
+               left:   '35%'
+       },
+
+       // styles for the overlay
+       overlayCSS:  {
+               backgroundColor: '#000',
+               opacity:                 0.6,
+               cursor:                  'wait'
+       },
+
+       // styles applied when using $.growlUI
+       growlCSS: {
+               width:          '350px',
+               top:            '10px',
+               left:           '',
+               right:          '10px',
+               border:         'none',
+               padding:        '5px',
+               opacity:        0.6,
+               cursor:         'default',
+               color:          '#fff',
+               backgroundColor: '#000',
+               '-webkit-border-radius': '10px',
+               '-moz-border-radius':    '10px',
+               'border-radius':                 '10px'
+       },
+       
+       // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w
+       // (hat tip to Jorge H. N. de Vasconcelos)
+       iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank',
+
+       // force usage of iframe in non-IE browsers (handy for blocking applets)
+       forceIframe: false,
+
+       // z-index for the blocking overlay
+       baseZ: 1000,
+
+       // set these to true to have the message automatically centered
+       centerX: true, // <-- only effects element blocking (page block controlled via css above)
+       centerY: true,
+
+       // allow body element to be stetched in ie6; this makes blocking look better
+       // on "short" pages.  disable if you wish to prevent changes to the body height
+       allowBodyStretch: true,
+
+       // enable if you want key and mouse events to be disabled for content that is blocked
+       bindEvents: true,
+
+       // be default blockUI will supress tab navigation from leaving blocking content
+       // (if bindEvents is true)
+       constrainTabKey: true,
+
+       // fadeIn time in millis; set to 0 to disable fadeIn on block
+       fadeIn:  200,
+
+       // fadeOut time in millis; set to 0 to disable fadeOut on unblock
+       fadeOut:  400,
+
+       // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock
+       timeout: 0,
+
+       // disable if you don't want to show the overlay
+       showOverlay: true,
+
+       // if true, focus will be placed in the first available input field when
+       // page blocking
+       focusInput: true,
+
+       // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity)
+       applyPlatformOpacityRules: true,
+       
+       // callback method invoked when fadeIn has completed and blocking message is visible
+       onBlock: null,
+
+       // callback method invoked when unblocking has completed; the callback is
+       // passed the element that has been unblocked (which is the window object for page
+       // blocks) and the options that were passed to the unblock call:
+       //       onUnblock(element, options)
+       onUnblock: null,
+
+       // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493
+       quirksmodeOffsetHack: 4,
+
+       // class name of the message block
+       blockMsgClass: 'blockMsg'
+};
+
+// private data and functions follow...
+
+var pageBlock = null;
+var pageBlockEls = [];
+
+function install(el, opts) {
+       var full = (el == window);
+       var msg = opts && opts.message !== undefined ? opts.message : undefined;
+       opts = $.extend({}, $.blockUI.defaults, opts || {});
+       opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {});
+       var css = $.extend({}, $.blockUI.defaults.css, opts.css || {});
+       var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {});
+       msg = msg === undefined ? opts.message : msg;
+
+       // remove the current block (if there is one)
+       if (full && pageBlock)
+               remove(window, {fadeOut:0});
+
+       // if an existing element is being used as the blocking content then we capture
+       // its current place in the DOM (and current display style) so we can restore
+       // it when we unblock
+       if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) {
+               var node = msg.jquery ? msg[0] : msg;
+               var data = {};
+               $(el).data('blockUI.history', data);
+               data.el = node;
+               data.parent = node.parentNode;
+               data.display = node.style.display;
+               data.position = node.style.position;
+               if (data.parent)
+                       data.parent.removeChild(node);
+       }
+
+       var z = opts.baseZ;
+
+       // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform;
+       // layer1 is the iframe layer which is used to supress bleed through of underlying content
+       // layer2 is the overlay layer which has opacity and a wait cursor (by default)
+       // layer3 is the message content that is displayed while blocking
+
+       var lyr1 = ($.browser.msie || opts.forceIframe) 
+               ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>')
+               : $('<div class="blockUI" style="display:none"></div>');
+       var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>');
+       
+       var lyr3, s;
+       if (opts.theme && full) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' +
+                               '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
+                               '<div class="ui-widget-content ui-dialog-content"></div>' +
+                       '</div>';
+       }
+       else if (opts.theme) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:absolute">' +
+                               '<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(opts.title || '&nbsp;')+'</div>' +
+                               '<div class="ui-widget-content ui-dialog-content"></div>' +
+                       '</div>';
+       }
+       else if (full) {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockPage" style="z-index:'+z+';display:none;position:fixed"></div>';
+       }                       
+       else {
+               s = '<div class="blockUI ' + opts.blockMsgClass + ' blockElement" style="z-index:'+z+';display:none;position:absolute"></div>';
+       }
+       lyr3 = $(s);
+
+       // if we have a message, style it
+       if (msg) {
+               if (opts.theme) {
+                       lyr3.css(themedCSS);
+                       lyr3.addClass('ui-widget-content');
+               }
+               else 
+                       lyr3.css(css);
+       }
+
+       // style the overlay
+       if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform)))
+               lyr2.css(opts.overlayCSS);
+       lyr2.css('position', full ? 'fixed' : 'absolute');
+
+       // make iframe layer transparent in IE
+       if ($.browser.msie || opts.forceIframe)
+               lyr1.css('opacity',0.0);
+
+       //$([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el);
+       var layers = [lyr1,lyr2,lyr3], $par = full ? $('body') : $(el);
+       $.each(layers, function() {
+               this.appendTo($par);
+       });
+       
+       if (opts.theme && opts.draggable && $.fn.draggable) {
+               lyr3.draggable({
+                       handle: '.ui-dialog-titlebar',
+                       cancel: 'li'
+               });
+       }
+
+       // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling)
+       var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0);
+       if (ie6 || expr) {
+               // give body 100% height
+               if (full && opts.allowBodyStretch && $.boxModel)
+                       $('html,body').css('height','100%');
+
+               // fix ie6 issue when blocked element has a border width
+               if ((ie6 || !$.boxModel) && !full) {
+                       var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth');
+                       var fixT = t ? '(0 - '+t+')' : 0;
+                       var fixL = l ? '(0 - '+l+')' : 0;
+               }
+
+               // simulate fixed position
+               $.each([lyr1,lyr2,lyr3], function(i,o) {
+                       var s = o[0].style;
+                       s.position = 'absolute';
+                       if (i < 2) {
+                               full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"')
+                                        : s.setExpression('height','this.parentNode.offsetHeight + "px"');
+                               full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"')
+                                        : s.setExpression('width','this.parentNode.offsetWidth + "px"');
+                               if (fixL) s.setExpression('left', fixL);
+                               if (fixT) s.setExpression('top', fixT);
+                       }
+                       else if (opts.centerY) {
+                               if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"');
+                               s.marginTop = 0;
+                       }
+                       else if (!opts.centerY && full) {
+                               var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0;
+                               var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"';
+                               s.setExpression('top',expression);
+                       }
+               });
+       }
+
+       // show the message
+       if (msg) {
+               if (opts.theme)
+                       lyr3.find('.ui-widget-content').append(msg);
+               else
+                       lyr3.append(msg);
+               if (msg.jquery || msg.nodeType)
+                       $(msg).show();
+       }
+
+       if (($.browser.msie || opts.forceIframe) && opts.showOverlay)
+               lyr1.show(); // opacity is zero
+       if (opts.fadeIn) {
+               var cb = opts.onBlock ? opts.onBlock : noOp;
+               var cb1 = (opts.showOverlay && !msg) ? cb : noOp;
+               var cb2 = msg ? cb : noOp;
+               if (opts.showOverlay)
+                       lyr2._fadeIn(opts.fadeIn, cb1);
+               if (msg)
+                       lyr3._fadeIn(opts.fadeIn, cb2);
+       }
+       else {
+               if (opts.showOverlay)
+                       lyr2.show();
+               if (msg)
+                       lyr3.show();
+               if (opts.onBlock)
+                       opts.onBlock();
+       }
+
+       // bind key and mouse events
+       bind(1, el, opts);
+
+       if (full) {
+               pageBlock = lyr3[0];
+               pageBlockEls = $(':input:enabled:visible',pageBlock);
+               if (opts.focusInput)
+                       setTimeout(focus, 20);
+       }
+       else
+               center(lyr3[0], opts.centerX, opts.centerY);
+
+       if (opts.timeout) {
+               // auto-unblock
+               var to = setTimeout(function() {
+                       full ? $.unblockUI(opts) : $(el).unblock(opts);
+               }, opts.timeout);
+               $(el).data('blockUI.timeout', to);
+       }
+};
+
+// remove the block
+function remove(el, opts) {
+       var full = (el == window);
+       var $el = $(el);
+       var data = $el.data('blockUI.history');
+       var to = $el.data('blockUI.timeout');
+       if (to) {
+               clearTimeout(to);
+               $el.removeData('blockUI.timeout');
+       }
+       opts = $.extend({}, $.blockUI.defaults, opts || {});
+       bind(0, el, opts); // unbind events
+       
+       var els;
+       if (full) // crazy selector to handle odd field errors in ie6/7
+               els = $('body').children().filter('.blockUI').add('body > .blockUI');
+       else
+               els = $('.blockUI', el);
+
+       if (full)
+               pageBlock = pageBlockEls = null;
+
+       if (opts.fadeOut) {
+               els.fadeOut(opts.fadeOut);
+               setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut);
+       }
+       else
+               reset(els, data, opts, el);
+};
+
+// move blocking element back into the DOM where it started
+function reset(els,data,opts,el) {
+       els.each(function(i,o) {
+               // remove via DOM calls so we don't lose event handlers
+               if (this.parentNode)
+                       this.parentNode.removeChild(this);
+       });
+
+       if (data && data.el) {
+               data.el.style.display = data.display;
+               data.el.style.position = data.position;
+               if (data.parent)
+                       data.parent.appendChild(data.el);
+               $(el).removeData('blockUI.history');
+       }
+
+       if (typeof opts.onUnblock == 'function')
+               opts.onUnblock(el,opts);
+};
+
+// bind/unbind the handler
+function bind(b, el, opts) {
+       var full = el == window, $el = $(el);
+
+       // don't bother unbinding if there is nothing to unbind
+       if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked')))
+               return;
+       if (!full)
+               $el.data('blockUI.isBlocked', b);
+
+       // don't bind events when overlay is not in use or if bindEvents is false
+       if (!opts.bindEvents || (b && !opts.showOverlay)) 
+               return;
+
+       // bind anchors and inputs for mouse and key events
+       var events = 'mousedown mouseup keydown keypress';
+       b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler);
+
+// former impl...
+//        var $e = $('a,:input');
+//        b ? $e.bind(events, opts, handler) : $e.unbind(events, handler);
+};
+
+// event handler to suppress keyboard/mouse events when blocking
+function handler(e) {
+       // allow tab navigation (conditionally)
+       if (e.keyCode && e.keyCode == 9) {
+               if (pageBlock && e.data.constrainTabKey) {
+                       var els = pageBlockEls;
+                       var fwd = !e.shiftKey && e.target === els[els.length-1];
+                       var back = e.shiftKey && e.target === els[0];
+                       if (fwd || back) {
+                               setTimeout(function(){focus(back)},10);
+                               return false;
+                       }
+               }
+       }
+       var opts = e.data;
+       // allow events within the message content
+       if ($(e.target).parents('div.' + opts.blockMsgClass).length > 0)
+               return true;
+
+       // allow events for content that is not being blocked
+       return $(e.target).parents().children().filter('div.blockUI').length == 0;
+};
+
+function focus(back) {
+       if (!pageBlockEls)
+               return;
+       var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0];
+       if (e)
+               e.focus();
+};
+
+function center(el, x, y) {
+       var p = el.parentNode, s = el.style;
+       var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth');
+       var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth');
+       if (x) s.left = l > 0 ? (l+'px') : '0';
+       if (y) s.top  = t > 0 ? (t+'px') : '0';
+};
+
+function sz(el, p) {
+       return parseInt($.css(el,p))||0;
+};
+
+})(jQuery);
diff --git a/examples/javascript/jquery.timer.js b/examples/javascript/jquery.timer.js
new file mode 100644 (file)
index 0000000..fe9afe2
--- /dev/null
@@ -0,0 +1,75 @@
+\feff/*
+ *
+ *     jQuery Timer plugin v0.1
+ *             Matt Schmidt [http://www.mattptr.net]
+ *
+ *     Licensed under the BSD License:
+ *             http://mattptr.net/license/license.txt
+ *
+ */
+ jQuery.timer = function (interval, callback)
+ {
+ /**
+  *
+  * timer() provides a cleaner way to handle intervals  
+  *
+  *    @usage
+  * $.timer(interval, callback);
+  *
+  *
+  * @example
+  * $.timer(1000, function (timer) {
+  *    alert("hello");
+  *    timer.stop();
+  * });
+  * @desc Show an alert box after 1 second and stop
+  * 
+  * @example
+  * var second = false;
+  *    $.timer(1000, function (timer) {
+  *            if (!second) {
+  *                    alert('First time!');
+  *                    second = true;
+  *                    timer.reset(3000);
+  *            }
+  *            else {
+  *                    alert('Second time');
+  *                    timer.stop();
+  *            }
+  *    });
+  * @desc Show an alert box after 1 second and show another after 3 seconds
+  *
+  * 
+  */
+
+       var interval = interval || 100;
+
+       if (!callback)
+               return false;
+       
+       _timer = function (interval, callback) {
+               this.stop = function () {
+                       clearInterval(self.id);
+               };
+               
+               this.internalCallback = function () {
+                       callback(self);
+               };
+               
+               this.reset = function (val) {
+                       if (self.id)
+                               clearInterval(self.id);
+                       
+                       var val = val || 100;
+                       this.id = setInterval(this.internalCallback, val);
+               };
+               
+               this.interval = interval;
+               this.id = setInterval(this.internalCallback, this.interval);
+               
+               var self = this;
+       };
+       
+       return new _timer(interval, callback);
+ };
\ No newline at end of file
diff --git a/examples/javascript/jshashtable-2.1.js b/examples/javascript/jshashtable-2.1.js
new file mode 100644 (file)
index 0000000..3b93622
--- /dev/null
@@ -0,0 +1,16 @@
+/**\r
+ * Copyright 2010 Tim Down.\r
+ *\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+var Hashtable=(function(){var p="function";var n=(typeof Array.prototype.splice==p)?function(s,r){s.splice(r,1)}:function(u,t){var s,v,r;if(t===u.length-1){u.length=t}else{s=u.slice(t+1);u.length=t;for(v=0,r=s.length;v<r;++v){u[t+v]=s[v]}}};function a(t){var r;if(typeof t=="string"){return t}else{if(typeof t.hashCode==p){r=t.hashCode();return(typeof r=="string")?r:a(r)}else{if(typeof t.toString==p){return t.toString()}else{try{return String(t)}catch(s){return Object.prototype.toString.call(t)}}}}}function g(r,s){return r.equals(s)}function e(r,s){return(typeof s.equals==p)?s.equals(r):(r===s)}function c(r){return function(s){if(s===null){throw new Error("null is not a valid "+r)}else{if(typeof s=="undefined"){throw new Error(r+" must not be undefined")}}}}var q=c("key"),l=c("value");function d(u,s,t,r){this[0]=u;this.entries=[];this.addEntry(s,t);if(r!==null){this.getEqualityFunction=function(){return r}}}var h=0,j=1,f=2;function o(r){return function(t){var s=this.entries.length,v,u=this.getEqualityFunction(t);while(s--){v=this.entries[s];if(u(t,v[0])){switch(r){case h:return true;case j:return v;case f:return[s,v[1]]}}}return false}}function k(r){return function(u){var v=u.length;for(var t=0,s=this.entries.length;t<s;++t){u[v+t]=this.entries[t][r]}}}d.prototype={getEqualityFunction:function(r){return(typeof r.equals==p)?g:e},getEntryForKey:o(j),getEntryAndIndexForKey:o(f),removeEntryForKey:function(s){var r=this.getEntryAndIndexForKey(s);if(r){n(this.entries,r[0]);return r[1]}return null},addEntry:function(r,s){this.entries[this.entries.length]=[r,s]},keys:k(0),values:k(1),getEntries:function(s){var u=s.length;for(var t=0,r=this.entries.length;t<r;++t){s[u+t]=this.entries[t].slice(0)}},containsKey:o(h),containsValue:function(s){var r=this.entries.length;while(r--){if(s===this.entries[r][1]){return true}}return false}};function m(s,t){var r=s.length,u;while(r--){u=s[r];if(t===u[0]){return r}}return null}function i(r,s){var t=r[s];return(t&&(t instanceof d))?t:null}function b(t,r){var w=this;var v=[];var u={};var x=(typeof t==p)?t:a;var s=(typeof r==p)?r:null;this.put=function(B,C){q(B);l(C);var D=x(B),E,A,z=null;E=i(u,D);if(E){A=E.getEntryForKey(B);if(A){z=A[1];A[1]=C}else{E.addEntry(B,C)}}else{E=new d(D,B,C,s);v[v.length]=E;u[D]=E}return z};this.get=function(A){q(A);var B=x(A);var C=i(u,B);if(C){var z=C.getEntryForKey(A);if(z){return z[1]}}return null};this.containsKey=function(A){q(A);var z=x(A);var B=i(u,z);return B?B.containsKey(A):false};this.containsValue=function(A){l(A);var z=v.length;while(z--){if(v[z].containsValue(A)){return true}}return false};this.clear=function(){v.length=0;u={}};this.isEmpty=function(){return !v.length};var y=function(z){return function(){var A=[],B=v.length;while(B--){v[B][z](A)}return A}};this.keys=y("keys");this.values=y("values");this.entries=y("getEntries");this.remove=function(B){q(B);var C=x(B),z,A=null;var D=i(u,C);if(D){A=D.removeEntryForKey(B);if(A!==null){if(!D.entries.length){z=m(v,C);n(v,z);delete u[C]}}}return A};this.size=function(){var A=0,z=v.length;while(z--){A+=v[z].entries.length}return A};this.each=function(C){var z=w.entries(),A=z.length,B;while(A--){B=z[A];C(B[0],B[1])}};this.putAll=function(H,C){var B=H.entries();var E,F,D,z,A=B.length;var G=(typeof C==p);while(A--){E=B[A];F=E[0];D=E[1];if(G&&(z=w.get(F))){D=C(F,z,D)}w.put(F,D)}};this.clone=function(){var z=new b(t,r);z.putAll(w);return z}}return b})();
\ No newline at end of file
diff --git a/examples/javascriptLaunch.html b/examples/javascriptLaunch.html
new file mode 100644 (file)
index 0000000..b6b4da1
--- /dev/null
@@ -0,0 +1,102 @@
+<html>
+  <head><title>Opening JalviewLite from Javascript</title>
+</head>
+  <body>
+  <SCRIPT type="text/javascript">
+  /* <![CDATA[ // */
+// From http://snipplr.com/view.php?codeview&id=1272
+//----------------------------------------
+//Wrapper function for constructing a request object.
+//     Parameters:
+//             reqType: The HTTP request type, such as GET or POST.
+//             url: The URL of the server program.
+//             asynch: Whether to send the request asynchronously or not.
+//----------------------------------------
+
+function httpRequest(reqType,url,asynch,respHandle) {
+
+       // Mozilla-based browsers
+       if (window.XMLHttpRequest) {
+               request = new XMLHttpRequest();
+       } else if (window.ActiveXObject) {
+               request = new ActiveXObject("Msxml2.XMLHTTP");
+               if (!request) {
+                       request = new ActiveXObject("Microsoft.XMLHTTP");
+               }
+       }
+       
+       // Request could still be null if neither ActiveXObject
+       //   initialization succeeded
+       if (request) {
+               // If the reqType param is POST, then the fifth arg is the POSTed data
+               if (reqType.toLowerCase() != "post") {
+                       initReq(reqType, url, asynch, respHandle);
+               } else {
+                       // The POSTed data
+                       var args = arguments[5];
+                       if (args != null && args.length > 0) {
+                               initReq(reqType, url, asynch, respHandle, args);
+                       }
+               }
+       } else {
+               alert("Your browser does not permit the use of all " +
+                       "of this application's features!");
+       }
+
+}
+
+//----------------------------------------
+//Initialize a request object that is already constructed
+//----------------------------------------
+
+function initReq(reqType, url, bool, respHandle) {
+       try {
+               // Specify the function that will handle the HTTP response
+               request.onreadystatechange = respHandle;
+               request.open(reqType, url, bool);
+               // If the reqType param is POST, then the
+               //   fifth argument to the function is the POSTed data
+               if (reqType.toLowerCase() == "post") {
+                       // Set the Content-Type header for a POST request
+                       request.setRequestHeader("Content-Type", "application/x-ww-form-urlencoded; charset=UTF-8");
+                       request.send(arguments[4]);
+               } else {
+                       request.send(null);
+               }
+       } catch (errv) {
+               alert("The application cannot contact the server at the moment. " +
+                       "Please try again in a few seconds.\n" +
+                       "Error detail: " + errv.message);
+       }
+}
+
+// jalview launching with fetched data
+
+function startJalview(aligURL,title,alwvar) {
+               var aligment = "";
+               httpRequest("get",aligURL,true,function() {
+                               if (request.readyState == 4) { 
+                                       alignment = request.responseText; 
+                                       eval("var "+alwvar+" = document.JalviewLite.loadAlignment(alignment,title)");
+                               }
+               })
+               
+}
+
+/* ]]> */
+</SCRIPT>
+  <form name="Form1">
+<applet name="JalviewLite"  code="jalview.bin.JalviewLite"
+archive="jalviewApplet.jar" width="0" height="0">
+<param name="debug" value="true"/>
+<param name="showbutton" value="false"/>
+</applet>
+
+
+  <input type="button" name="Button1" value="Start"
+onClick="startJalview('plantfdx.fa','Button1.alignment','alwvar')"/>
+  </form>
+  
+
+  </body>
+</html>
\ No newline at end of file
diff --git a/examples/jmol/Jmol.js b/examples/jmol/Jmol.js
new file mode 100644 (file)
index 0000000..6962276
--- /dev/null
@@ -0,0 +1,1705 @@
+/* Jmol 12.0 script library Jmol.js 9:48 PM 1/31/2011 Bob Hanson\r
+\r
+ checkbox heirarchy -- see http://chemapps.stolaf.edu/jmol/docs/examples-11/check.htm\r
+\r
+    based on:\r
+ *\r
+ * Copyright (C) 2004-2005  Miguel, Jmol Development, www.jmol.org\r
+ *\r
+ * Contact: hansonr@stolaf.edu\r
+ *\r
+ *  This library is free software; you can redistribute it and/or\r
+ *  modify it under the terms of the GNU Lesser General Public\r
+ *  License as published by the Free Software Foundation; either\r
+ *  version 2.1 of the License, or (at your option) any later version.\r
+ *\r
+ *  This library is distributed in the hope that it will be useful,\r
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+ *  Lesser General Public License for more details.\r
+ *\r
+ *  You should have received a copy of the GNU Lesser General Public\r
+ *  License along with this library; if not, write to the Free Software\r
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA\r
+ *  02111-1307  USA.\r
+ */\r
+\r
+// for documentation see www.jmol.org/jslibrary\r
+\r
+try{if(typeof(_jmol)!="undefined")exit()\r
+\r
+// place "?NOAPPLET" on your command line to check applet control action with a textarea\r
+// place "?JMOLJAR=xxxxx" to use a specific jar file\r
+\r
+// bob hanson -- jmolResize(w,h) -- resizes absolutely or by percent (w or h 0.5 means 50%)\r
+//    angel herraez -- update of jmolResize(w,h,targetSuffix) so it is not tied to first applet\r
+// bob hanson -- jmolEvaluate -- evaluates molecular math 8:37 AM 2/23/2007\r
+// bob hanson -- jmolScriptMessage -- returns all "scriptStatus" messages 8:37 AM 2/23/2007\r
+// bob hanson -- jmolScriptEcho -- returns all "scriptEcho" messages 8:37 AM 2/23/2007\r
+// bob hanson -- jmolScriptWait -- 11:31 AM 5/2/2006\r
+// bob hanson -- remove trailing separatorHTML in radio groups -- 12:18 PM 5/6/2006\r
+// bob hanson -- adds support for dynamic DOM script nodes 7:04 AM 5/19/2006\r
+// bob hanson -- adds try/catch for wiki - multiple code passes 7:05 AM 5/19/2006\r
+// bob hanson -- auto-initiates to defaultdir/defaultjar -- change as desired.\r
+// bob hanson -- adding save/restore orientation w/ and w/o delay 11:49 AM 5/25/2006\r
+// bob hanson -- adding AjaxJS service 11:16 AM 6/3/2006\r
+// bob hanson -- fix for iframes not available for finding applet\r
+// bob hanson -- added applet fake ?NOAPPLET URL flag\r
+// bob hanson -- added jmolSetCallback(calbackName, funcName) 3:32 PM 6/13/2006\r
+//                     used PRIOR to jmolApplet() or jmolAppletInline()\r
+//               added 4th array element in jmolRadioGroup -- title\r
+//               added <span> and id around link, checkbox, radio, menu\r
+//               fixing AJAX loads for MSIE/Opera-Mozilla incompatibility\r
+//            -- renamed Jmol-11.js from Jmol-new.js; JmolApplet.jar from JmolAppletProto.jar\r
+//              renamed Jmol.js for Jmol 11 distribution\r
+//            -- modified jmolRestoreOrientation() to be immediate, no 1-second delay\r
+// bob hanson -- jmolScriptWait always returns a string -- 11:23 AM 9/16/2006\r
+// bh         -- jmolCommandInput()\r
+// bh         -- jmolSetTranslation(TF) -- forces translation even if there might be message callback issues\r
+// bh         -- minor fixes suggested by Angel\r
+// bh         -- adds jmolSetSyncId() and jmolGetSyncId()\r
+// bh 3/2008  -- adds jmolAppendInlineScript() and jmolAppendInlineArray()\r
+// bh 3/2008  -- fixes IE7 bug in relation to jmolLoadInlineArray()\r
+// bh 6/2008  -- adds jmolSetAppletWindow()\r
+// Angel H. 6/2008  -- added html <label> tags to checkboxes and radio buttons [in jmolCheckbox() and _jmolRadio() functions]\r
+// bh 7/2008  -- code fix "for(i..." not "for(var i..."\r
+// bh 12/2008 -- jmolLoadInline, jmolLoadInlineArray, jmolLoadInlineScript, jmolAppendInlineScript, jmolAppendInlineArray all return error message or null (Jmol 11.7.16)\r
+// bh 12/2008 -- jmolScriptWaitOutput() -- waits for script to complete and delivers output normally sent to console\r
+\r
+// bh 5/2009  -- Support for XHTML using jmolSetXHTML(id)\r
+// ah & bh 6/2009 -- New jmolResizeApplet() more flexible, similar to jmolApplet() size syntax\r
+// bh 11/2009 -- care in accessing top.document\r
+// bh 12/2009 -- added jmolSetParameter(name, value)\r
+// bh 12/2009 -- added PARAMS=name:value;name:value;name:value... for command line\r
+// bh 12/2009 -- overhaul of target checking\r
+// bh 1/2010  -- all _xxxx() methods ALWAYS have complete argument list\r
+// bh 1/2010  -- adds option to run a JavaScript function from any Jmol control. \r
+//               This is accomplished by passing an array rather than a script:\r
+//               jmolHref([myfunc,"my param 1", "my param 2"], "testing")\r
+//               function myfunc(jmolControlObject, [myfunc,"my param 1", "my param 2"], target){...}\r
+//               and allows much more flexibility with responding to controls\r
+// bh 4/2010  -- added jmolSetMemoryMb(nMb)\r
+// ah 1/2011  -- wider detection of browsers; more browsers now use the object tag instead of the applet tag; \r
+//               fix of object tag (removed classid) accounts for change of behavior in Chrome\r
+// bh 3/2011  -- added jmolLoadAjax_STOLAF_NIH\r
+\r
+var defaultdir = "."\r
+var defaultjar = "JmolApplet.jar"\r
+\r
+\r
+// Note added 12:41 PM 9/21/2008 by Bob Hanson, hansonr@stolaf.edu:\r
+\r
+// JMOLJAR=xxxxx.jar on the URL for this page will override\r
+// the JAR file specified in the jmolInitialize() call.\r
+\r
+// The idea is that it can be very useful to test a web page with different JAR files\r
+// Or for an expert user to substitute a signed applet for an unsigned one\r
+// so as to use a broader range of models or to create JPEG files, for example.\r
+\r
+// If the JAR file is not in the current directory (has any sort of "/" in its name)\r
+// then the user is presented with a warning and asked whether it is OK to change Jar files.\r
+// The default action, if the user just presses "OK" is to NOT allow the change. \r
+// The user must type the word "yes" in the prompt box for the change to be approved.\r
+\r
+// If you don't want people to be able to switch in their own JAR file on your page,\r
+// simply set this next line to read "var allowJMOLJAR = false".\r
+\r
+\r
+var undefined; // for IE 5 ... wherein undefined is undefined\r
+\r
+////////////////////////////////////////////////////////////////\r
+// Basic Scripting infrastruture\r
+////////////////////////////////////////////////////////////////\r
+\r
+function jmolInitialize(codebaseDirectory, fileNameOrUseSignedApplet) {\r
+  if (_jmol.initialized)\r
+    return;\r
+  _jmol.initialized = true;\r
+  if(_jmol.jmoljar) {\r
+    var f = _jmol.jmoljar;\r
+    if (f.indexOf("/") >= 0) {\r
+      alert ("This web page URL is requesting that the applet used be " + f + ". This is a possible security risk, particularly if the applet is signed, because signed applets can read and write files on your local machine or network.")\r
+      var ok = prompt("Do you want to use applet " + f + "? ","yes or no")\r
+      if (ok == "yes") {\r
+        codebaseDirectory = f.substring(0, f.lastIndexOf("/"));\r
+        fileNameOrUseSignedApplet = f.substring(f.lastIndexOf("/") + 1);\r
+      } else {\r
+       _jmolGetJarFilename(fileNameOrUseSignedApplet);\r
+        alert("The web page URL was ignored. Continuing using " + _jmol.archivePath + ' in directory "' + codebaseDirectory + '"');\r
+      }\r
+    } else {\r
+      fileNameOrUseSignedApplet = f;\r
+    }\r
+  }\r
+  _jmolSetCodebase(codebaseDirectory);\r
+  _jmolGetJarFilename(fileNameOrUseSignedApplet);\r
+  _jmolOnloadResetForms();\r
+}\r
+\r
+function jmolSetTranslation(TF) {\r
+  _jmol.params.doTranslate = ''+TF;\r
+}\r
+\r
+function _jmolGetJarFilename(fileNameOrFlag) {\r
+  _jmol.archivePath =\r
+    (typeof(fileNameOrFlag) == "string"  ? fileNameOrFlag : (fileNameOrFlag ?  "JmolAppletSigned" : "JmolApplet") + "0.jar");\r
+}\r
+\r
+function jmolSetDocument(doc) {\r
+  _jmol.currentDocument = doc;\r
+}\r
+\r
+function jmolSetAppletColor(boxbgcolor, boxfgcolor, progresscolor) {\r
+  _jmolInitCheck();\r
+  _jmol.params.boxbgcolor = boxbgcolor;\r
+  if (boxfgcolor)\r
+    _jmol.params.boxfgcolor = boxfgcolor\r
+  else if (boxbgcolor == "white" || boxbgcolor == "#FFFFFF")\r
+    _jmol.params.boxfgcolor = "black";\r
+  else\r
+    _jmol.params.boxfgcolor = "white";\r
+  if (progresscolor)\r
+    _jmol.params.progresscolor = progresscolor;\r
+  if (_jmol.debugAlert)\r
+    alert(" boxbgcolor=" + _jmol.params.boxbgcolor +\r
+          " boxfgcolor=" + _jmol.params.boxfgcolor +\r
+          " progresscolor=" + _jmol.params.progresscolor);\r
+}\r
+\r
+function jmolSetAppletWindow(w) {\r
+  _jmol.appletWindow = w;\r
+}\r
+\r
+function jmolApplet(size, script, nameSuffix) {\r
+  _jmolInitCheck();\r
+  return _jmolApplet(size, null, script, nameSuffix);\r
+}\r
+\r
+////////////////////////////////////////////////////////////////\r
+// Basic controls\r
+////////////////////////////////////////////////////////////////\r
+\r
+// undefined means it wasn't there; null means it was explicitly listed as null (so as to skip it)\r
+\r
+function jmolButton(script, label, id, title) {\r
+  _jmolInitCheck();\r
+  id != undefined && id != null || (id = "jmolButton" + _jmol.buttonCount);\r
+  label != undefined && label != null || (label = script.substring(0, 32));\r
+  ++_jmol.buttonCount;\r
+  var scriptIndex = _jmolAddScript(script);\r
+  var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='button' name='" + id + "' id='" + id +\r
+          "' value='" + label +\r
+          "' onclick='_jmolClick(this," + scriptIndex + _jmol.targetText +\r
+          ")' onmouseover='_jmolMouseOver(" + scriptIndex +\r
+          ");return true' onmouseout='_jmolMouseOut()' " +\r
+          _jmol.buttonCssText + " /></span>";\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+function jmolCheckbox(scriptWhenChecked, scriptWhenUnchecked,\r
+                      labelHtml, isChecked, id, title) {\r
+  _jmolInitCheck();\r
+  id != undefined && id != null || (id = "jmolCheckbox" + _jmol.checkboxCount);\r
+  ++_jmol.checkboxCount;\r
+  if (scriptWhenChecked == undefined || scriptWhenChecked == null ||\r
+      scriptWhenUnchecked == undefined || scriptWhenUnchecked == null) {\r
+    alert("jmolCheckbox requires two scripts");\r
+    return;\r
+  }\r
+  if (labelHtml == undefined || labelHtml == null) {\r
+    alert("jmolCheckbox requires a label");\r
+    return;\r
+  }\r
+  var indexChecked = _jmolAddScript(scriptWhenChecked);\r
+  var indexUnchecked = _jmolAddScript(scriptWhenUnchecked);\r
+  var eospan = "</span>"\r
+  var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input type='checkbox' name='" + id + "' id='" + id +\r
+          "' onclick='_jmolCbClick(this," +\r
+          indexChecked + "," + indexUnchecked + _jmol.targetText +\r
+          ")' onmouseover='_jmolCbOver(this," + indexChecked + "," +\r
+          indexUnchecked +\r
+          ");return true' onmouseout='_jmolMouseOut()' " +\r
+         (isChecked ? "checked='true' " : "")+ _jmol.checkboxCssText + " />" \r
+  if (labelHtml.toLowerCase().indexOf("<td>")>=0) {\r
+       t += eospan\r
+       eospan = "";\r
+  }\r
+  t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan;\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+function jmolStartNewRadioGroup() {\r
+  ++_jmol.radioGroupCount;\r
+}\r
+\r
+function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName, id, title) {\r
+  /*\r
+\r
+    array: [radio1,radio2,radio3...]\r
+    where radioN = ["script","label",isSelected,"id","title"]\r
+\r
+  */\r
+\r
+  _jmolInitCheck();\r
+  var type = typeof arrayOfRadioButtons;\r
+  if (type != "object" || type == null || ! arrayOfRadioButtons.length) {\r
+    alert("invalid arrayOfRadioButtons");\r
+    return;\r
+  }\r
+  separatorHtml != undefined && separatorHtml != null || (separatorHtml = "&nbsp; ");\r
+  var len = arrayOfRadioButtons.length;\r
+  jmolStartNewRadioGroup();\r
+  groupName || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));\r
+  var t = "<span id='"+(id ? id : groupName)+"'>";\r
+  for (var i = 0; i < len; ++i) {\r
+    if (i == len - 1)\r
+      separatorHtml = "";\r
+    var radio = arrayOfRadioButtons[i];\r
+    type = typeof radio;\r
+    if (type == "object") {\r
+      t += _jmolRadio(radio[0], radio[1], radio[2], separatorHtml, groupName, (radio.length > 3 ? radio[3]: (id ? id : groupName)+"_"+i), (radio.length > 4 ? radio[4] : 0), title);\r
+    } else {\r
+      t += _jmolRadio(radio, null, null, separatorHtml, groupName, (id ? id : groupName)+"_"+i, title);\r
+    }\r
+  }\r
+  t+="</span>"\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+\r
+function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {\r
+  _jmolInitCheck();\r
+  if (_jmol.radioGroupCount == 0)\r
+    ++_jmol.radioGroupCount;\r
+  var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, (id ? id : groupName + "_" + _jmol.radioCount), title ? title : 0);\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+function jmolLink(script, label, id, title) {\r
+  _jmolInitCheck();\r
+  id != undefined && id != null || (id = "jmolLink" + _jmol.linkCount);\r
+  label != undefined && label != null || (label = script.substring(0, 32));\r
+  ++_jmol.linkCount;\r
+  var scriptIndex = _jmolAddScript(script);\r
+  var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><a name='" + id + "' id='" + id + \r
+          "' href='javascript:_jmolClick(this," + scriptIndex + _jmol.targetText + ");' onmouseover='_jmolMouseOver(" + scriptIndex +\r
+          ");return true;' onmouseout='_jmolMouseOut()' " +\r
+          _jmol.linkCssText + ">" + label + "</a></span>";\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+function jmolCommandInput(label, size, id, title) {\r
+  _jmolInitCheck();\r
+  id != undefined && id != null || (id = "jmolCmd" + _jmol.cmdCount);\r
+  label != undefined && label != null || (label = "Execute");\r
+  size != undefined && !isNaN(size) || (size = 60);\r
+  ++_jmol.cmdCount;\r
+  var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" + id + "' id='" + id + \r
+          "' size='"+size+"' onkeypress='_jmolCommandKeyPress(event,\""+id+"\"" + _jmol.targetText + ")'><input type=button value = '"+label+"' onclick='jmolScript(document.getElementById(\""+id+"\").value" + _jmol.targetText + ")' /></span>";\r
+  if (_jmol.debugAlert)\r
+    alert(t);\r
+  return _jmolDocumentWrite(t);\r
+}\r
+\r
+function _jmolCommandKeyPress(e, id, target) {\r
+       var keycode = (window.event ? window.event.keyCode : e ? e.which : 0);\r
+       if (keycode == 13) {\r
+               var inputBox = document.getElementById(id)\r
+               _jmolScriptExecute(inputBox, inputBox.value, target)\r
+       }\r
+}\r
+\r
+function _jmolScriptExecute(element,script,target) {\r
+       if (typeof(script) == "object")\r
+               script[0](element, script, target)\r
+       else\r
+               jmolScript(script, target) \r
+}\r
+\r
+function jmolMenu(arrayOfMenuItems, size, id, title) {\r
+  _jmolInitCheck();\r
+  id != undefined && id != null || (id = "jmolMenu" + _jmol.menuCount);\r
+  ++_jmol.menuCount;\r
+  var type = typeof arrayOfMenuItems;\r
+  if (type != null && type == "object" && arrayOfMenuItems.length) {\r
+    var len = arrayOfMenuItems.length;\r
+    if (typeof size != "number" || size == 1)\r
+      size = null;\r
+    else if (size < 0)\r
+      size = len;\r
+    var sizeText = size ? " size='" + size + "' " : "";\r
+    var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><select name='" + id + "' id='" + id +\r
+            "' onChange='_jmolMenuSelected(this" + _jmol.targetText + ")'" +\r
+            sizeText + _jmol.menuCssText + ">";\r
+    for (var i = 0; i < len; ++i) {\r
+      var menuItem = arrayOfMenuItems[i];\r
+      type = typeof menuItem;\r
+      var script, text;\r
+      var isSelected = undefined;\r
+      if (type == "object" && menuItem != null) {\r
+        script = menuItem[0];\r
+        text = menuItem[1];\r
+        isSelected = menuItem[2];\r
+      } else {\r
+        script = text = menuItem;\r
+      }\r
+      text != undefined && text != null || (text = script);            \r
+      if (script=="#optgroup") {\r
+        t += "<optgroup label='" + text + "'>";          \r
+         } else if (script=="#optgroupEnd") {\r
+        t += "</optgroup>";      \r
+         } else {              \r
+        var scriptIndex = _jmolAddScript(script);\r
+        var selectedText = isSelected ? "' selected='true'>" : "'>";\r
+        t += "<option value='" + scriptIndex + selectedText + text + "</option>";\r
+      }\r
+    }\r
+    t += "</select></span>";\r
+    if (_jmol.debugAlert)\r
+      alert(t);\r
+    return _jmolDocumentWrite(t);\r
+  }\r
+}\r
+\r
+function jmolHtml(html) {\r
+  return _jmolDocumentWrite(html);\r
+}\r
+\r
+function jmolBr() {\r
+  return _jmolDocumentWrite("<br />");\r
+}\r
+\r
+////////////////////////////////////////////////////////////////\r
+// advanced scripting functions\r
+////////////////////////////////////////////////////////////////\r
+\r
+function jmolDebugAlert(enableAlerts) {\r
+  _jmol.debugAlert = (enableAlerts == undefined || enableAlerts)\r
+}\r
+\r
+function jmolAppletInline(size, inlineModel, script, nameSuffix) {\r
+  _jmolInitCheck();\r
+  return _jmolApplet(size, _jmolSterilizeInline(inlineModel),\r
+                     script, nameSuffix);\r
+}\r
+\r
+function jmolSetTarget(targetSuffix) {\r
+  _jmol.targetSuffix = targetSuffix;\r
+  _jmol.targetText = targetSuffix ? ",\"" + targetSuffix + "\"" : ",0";\r
+}\r
+\r
+function jmolScript(script, targetSuffix) {\r
+  if (script) {\r
+    _jmolCheckBrowser();\r
+    if (targetSuffix == "all") {\r
+      with (_jmol) {\r
+       for (var i = 0; i < appletSuffixes.length; ++i) {\r
+         var applet = _jmolGetApplet(appletSuffixes[i]);\r
+          if (applet) applet.script(script);\r
+        }\r
+      }\r
+    } else {\r
+      var applet=_jmolGetApplet(targetSuffix);\r
+      if (applet) applet.script(script);\r
+    }\r
+  }\r
+}\r
+\r
+function jmolLoadInline(model, targetSuffix) {\r
+  if (!model)return "ERROR: NO MODEL"\r
+  var applet=_jmolGetApplet(targetSuffix);\r
+  if (!applet)return "ERROR: NO APPLET"\r
+  if (typeof(model) == "string")\r
+    return applet.loadInlineString(model, "", false);\r
+  else\r
+    return applet.loadInlineArray(model, "", false);\r
+}\r
+\r
+\r
+function jmolLoadInlineScript(model, script, targetSuffix) {\r
+  if (!model)return "ERROR: NO MODEL"\r
+  var applet=_jmolGetApplet(targetSuffix);\r
+  if (!applet)return "ERROR: NO APPLET"\r
+  return applet.loadInlineString(model, script, false);\r
+}\r
+\r
+\r
+function jmolLoadInlineArray(ModelArray, script, targetSuffix) {\r
+  if (!model)return "ERROR: NO MODEL"\r
+  script || (script="")\r
+  var applet=_jmolGetApplet(targetSuffix);\r
+  if (!applet)return "ERROR: NO APPLET"\r
+  try {\r
+    return applet.loadInlineArray(ModelArray, script, false);\r
+  } catch (err) {\r
+    //IE 7 bug\r
+    return applet.loadInlineString(ModelArray.join("\n"), script, false);\r
+  }\r
+}\r
+\r
+function jmolAppendInlineArray(ModelArray, script, targetSuffix) {\r
+  if (!model)return "ERROR: NO MODEL"\r
+  script || (script="")\r
+  var applet=_jmolGetApplet(targetSuffix);\r
+  if (!applet)return "ERROR: NO APPLET"\r
+  try {\r
+    return applet.loadInlineArray(ModelArray, script, true);\r
+  } catch (err) {\r
+    //IE 7 bug\r
+    return applet.loadInlineString(ModelArray.join("\n"), script, true);\r
+  }\r
+}\r
+\r
+function jmolAppendInlineScript(model, script, targetSuffix) {\r
+  if (!model)return "ERROR: NO MODEL"\r
+  var applet=_jmolGetApplet(targetSuffix);\r
+  if (!applet)return "ERROR: NO APPLET"\r
+  return applet.loadInlineString(model, script, true);\r
+}\r
+\r
+function jmolCheckBrowser(action, urlOrMessage, nowOrLater) {\r
+  if (typeof action == "string") {\r
+    action = action.toLowerCase();\r
+    action == "alert" || action == "redirect" || action == "popup" || (action = null);\r
+  }\r
+  if (typeof action != "string")\r
+    alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +\r
+          "action must be 'alert', 'redirect', or 'popup'");\r
+  else {\r
+    if (typeof urlOrMessage != "string")\r
+      alert("jmolCheckBrowser(action, urlOrMessage, nowOrLater)\n\n" +\r
+            "urlOrMessage must be a string");\r
+    else {\r
+      _jmol.checkBrowserAction = action;\r
+      _jmol.checkBrowserUrlOrMessage = urlOrMessage;\r
+    }\r
+  }\r
+  if (typeof nowOrLater == "string" && nowOrLater.toLowerCase() == "now")\r
+    _jmolCheckBrowser();\r
+}\r
+\r
+////////////////////////////////////////////////////////////////\r
+// Cascading Style Sheet Class support\r
+////////////////////////////////////////////////////////////////\r
+\r
+function jmolSetAppletCssClass(appletCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.appletCssClass = appletCssClass;\r
+    _jmol.appletCssText = appletCssClass ? "class='" + appletCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+function jmolSetButtonCssClass(buttonCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.buttonCssClass = buttonCssClass;\r
+    _jmol.buttonCssText = buttonCssClass ? "class='" + buttonCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+function jmolSetCheckboxCssClass(checkboxCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.checkboxCssClass = checkboxCssClass;\r
+    _jmol.checkboxCssText = checkboxCssClass ? "class='" + checkboxCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+function jmolSetRadioCssClass(radioCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.radioCssClass = radioCssClass;\r
+    _jmol.radioCssText = radioCssClass ? "class='" + radioCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+function jmolSetLinkCssClass(linkCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.linkCssClass = linkCssClass;\r
+    _jmol.linkCssText = linkCssClass ? "class='" + linkCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+function jmolSetMenuCssClass(menuCssClass) {\r
+  if (_jmol.hasGetElementById) {\r
+    _jmol.menuCssClass = menuCssClass;\r
+    _jmol.menuCssText = menuCssClass ? "class='" + menuCssClass + "' " : "";\r
+  }\r
+}\r
+\r
+////////////////////////////////////////////////////////////////\r
+// functions for INTERNAL USE ONLY which are subject to change\r
+// use at your own risk ... you have been WARNED!\r
+////////////////////////////////////////////////////////////////\r
+var _jmol = {\r
+  currentDocument: document,\r
+\r
+  debugAlert: false,\r
+  \r
+  codebase: "",\r
+  modelbase: ".",\r
+  \r
+  appletCount: 0,\r
+  appletSuffixes: [],\r
+  appletWindow: null,\r
+  allowedJmolSize: [25, 2048, 300],   // min, max, default (pixels)\r
+         /*  By setting the _jmol.allowedJmolSize[] variable in the webpage \r
+             before calling jmolApplet(), limits for applet size can be overriden.\r
+                   2048 standard for GeoWall (http://geowall.geo.lsa.umich.edu/home.html)\r
+         */  \r
+  buttonCount: 0,\r
+  checkboxCount: 0,\r
+  linkCount: 0,\r
+  cmdCount: 0,\r
+  menuCount: 0,\r
+  radioCount: 0,\r
+  radioGroupCount: 0,\r
+  \r
+  appletCssClass: null,\r
+  appletCssText: "",\r
+  buttonCssClass: null,\r
+  buttonCssText: "",\r
+  checkboxCssClass: null,\r
+  checkboxCssText: "",\r
+  java_arguments: "-Xmx512m",\r
+  radioCssClass: null,\r
+  radioCssText: "",\r
+  linkCssClass: null,\r
+  linkCssText: "",\r
+  menuCssClass: null,\r
+  menuCssText: "",\r
+  \r
+  targetSuffix: 0,\r
+  targetText: ",0",\r
+  scripts: [""],\r
+  params: {\r
+       syncId: ("" + Math.random()).substring(3),\r
+       progressbar: "true",\r
+       progresscolor: "blue",\r
+       boxbgcolor: "black",\r
+       boxfgcolor: "white",\r
+       boxmessage: "Downloading JmolApplet ..."\r
+  },\r
+  ua: navigator.userAgent.toLowerCase(),\r
+  // uaVersion: parseFloat(navigator.appVersion),  // not used\r
+  \r
+  os: "unknown",\r
+  browser: "unknown",\r
+  browserVersion: 0,\r
+  hasGetElementById: !!document.getElementById,\r
+  isJavaEnabled: navigator.javaEnabled(),\r
+  // isNetscape47Win: false,  // not used, N4.7 is no longer supported even for detection\r
+  useIEObject: false,\r
+  useHtml4Object: false,\r
+  \r
+  windowsClassId: "clsid:8AD9C840-044E-11D1-B3E9-00805F499D93",\r
+  windowsCabUrl:\r
+   "http://java.sun.com/update/1.6.0/jinstall-6u22-windows-i586.cab",\r
+\r
+  isBrowserCompliant: false,\r
+  isJavaCompliant: false,\r
+  isFullyCompliant: false,\r
+\r
+  initialized: false,\r
+  initChecked: false,\r
+  \r
+  browserChecked: false,\r
+  checkBrowserAction: "alert",\r
+  checkBrowserUrlOrMessage: null,\r
+\r
+  archivePath: null, // JmolApplet0.jar OR JmolAppletSigned0.jar\r
+\r
+  previousOnloadHandler: null,\r
+\r
+  jmoljar: null,  \r
+  useNoApplet: false,\r
+\r
+  ready: {}\r
+}\r
+\r
+with (_jmol) {\r
+  function _jmolTestUA(candidate) {\r
+    var ua = _jmol.ua;\r
+    var index = ua.indexOf(candidate);\r
+    if (index < 0)\r
+      return false;\r
+    _jmol.browser = candidate;\r
+    _jmol.browserVersion = parseFloat(ua.substring(index+candidate.length+1));\r
+    return true;\r
+  }\r
+  \r
+  function _jmolTestOS(candidate) {\r
+    if (_jmol.ua.indexOf(candidate) < 0)\r
+      return false;\r
+    _jmol.os = candidate;\r
+    return true;\r
+  }\r
+  \r
+  _jmolTestUA("konqueror") ||\r
+  _jmolTestUA("webkit") ||\r
+  _jmolTestUA("omniweb") ||\r
+  _jmolTestUA("opera") ||\r
+  _jmolTestUA("webtv") ||\r
+  _jmolTestUA("icab") ||\r
+  _jmolTestUA("msie") ||\r
+  (_jmol.ua.indexOf("compatible") < 0 && _jmolTestUA("mozilla")); //Netscape, Mozilla, Seamonkey, Firefox and anything assimilated\r
+  \r
+  _jmolTestOS("linux") ||\r
+  _jmolTestOS("unix") ||\r
+  _jmolTestOS("mac") ||\r
+  _jmolTestOS("win");\r
+\r
+  /* not used:\r
+       isNetscape47Win = (os == "win" && browser == "mozilla" &&\r
+                     browserVersion >= 4.78 && browserVersion <= 4.8);\r
+       */\r
+\r
+  if (os == "win") {\r
+    isBrowserCompliant = hasGetElementById;\r
+  } else if (os == "mac") { // mac is the problem child :-(\r
+    if (browser == "mozilla" && browserVersion >= 5) {\r
+      // miguel 2004 11 17\r
+      // checking the plugins array does not work because\r
+      // Netscape 7.2 OS X still has Java 1.3.1 listed even though\r
+      // javaplugin.sf.net is installed to upgrade to 1.4.2\r
+      eval("try {var v = java.lang.System.getProperty('java.version');" +\r
+           " _jmol.isBrowserCompliant = v >= '1.4.2';" +\r
+           " } catch (e) { }");\r
+    } else if (browser == "opera" && browserVersion <= 7.54) {\r
+      isBrowserCompliant = false;\r
+    } else {\r
+      isBrowserCompliant = hasGetElementById &&\r
+        !((browser == "msie") ||\r
+          (browser == "webkit" && browserVersion < 125.12));\r
+    }\r
+  } else if (os == "linux" || os == "unix") {\r
+    if (browser == "konqueror" && browserVersion <= 3.3)\r
+      isBrowserCompliant = false;\r
+    else\r
+      isBrowserCompliant = hasGetElementById;\r
+  } else { // other OS\r
+    isBrowserCompliant = hasGetElementById;\r
+  }\r
+\r
+  // possibly more checks in the future for this\r
+  isJavaCompliant = isJavaEnabled;\r
+\r
+  isFullyCompliant = isBrowserCompliant && isJavaCompliant;\r
+\r
+  useIEObject = (os == "win" && browser == "msie" && browserVersion >= 5.5);\r
+  useHtml4Object =\r
+   (browser == "mozilla" && browserVersion >= 5) ||\r
+   (browser == "opera" && browserVersion >= 8) ||\r
+   (browser == "webkit" && browserVersion >= 412.2);\r
+ try {\r
+  if (top.location.search.indexOf("JMOLJAR=")>=0)\r
+    jmoljar = top.location.search.split("JMOLJAR=")[1].split("&")[0];\r
+ } catch(e) {\r
+  // can't access top.location\r
+ }\r
+ try {\r
+  useNoApplet = (top.location.search.indexOf("NOAPPLET")>=0);\r
+ } catch(e) {\r
+  // can't access top.document\r
+ }\r
+}\r
+\r
+function jmolSetMemoryMb(nMb) {\r
+  _jmol.java_arguments = "-Xmx" + Math.round(nMb) + "m"\r
+}\r
+\r
+function jmolSetParameter(name,value) {\r
+  _jmol.params[name] = value\r
+}\r
+\r
+function jmolSetCallback(callbackName,funcName) {\r
+  _jmol.params[callbackName] = funcName\r
+}\r
+\r
+ try {\r
+// note this is done FIRST, so it cannot override a setting done by the developer\r
+  if (top.location.search.indexOf("PARAMS=")>=0) {\r
+    var pars = unescape(top.location.search.split("PARAMS=")[1].split("&")[0]).split(";");\r
+    for (var i = 0; i < pars.length; i++) {\r
+      var p = pars[i].split(":");\r
+      jmolSetParameter(p[0],p[1]);\r
+    }\r
+  }\r
+ } catch(e) {\r
+  // can't access top.location\r
+ }\r
+\r
+function jmolSetSyncId(n) {\r
+  return _jmol.params["syncId"] = n\r
+}\r
+\r
+function jmolGetSyncId() {\r
+  return _jmol.params["syncId"]\r
+}\r
+\r
+function jmolSetLogLevel(n) {\r
+  _jmol.params.logLevel = ''+n;\r
+}\r
+\r
+       /*  AngelH, mar2007:\r
+               By (re)setting these variables in the webpage before calling jmolApplet(), \r
+               a custom message can be provided (e.g. localized for user's language) when no Java is installed.\r
+       */\r
+if (noJavaMsg==undefined) var noJavaMsg = \r
+        "You do not have Java applets enabled in your web browser, or your browser is blocking this applet.<br />\n" +\r
+        "Check the warning message from your browser and/or enable Java applets in<br />\n" +\r
+        "your web browser preferences, or install the Java Runtime Environment from <a href='http://www.java.com'>www.java.com</a><br />";\r
+if (noJavaMsg2==undefined) var noJavaMsg2 = \r
+        "You do not have the<br />\n" +\r
+        "Java Runtime Environment<br />\n" +\r
+        "installed for applet support.<br />\n" +\r
+        "Visit <a href='http://www.java.com'>www.java.com</a>";\r
+function _jmolApplet(size, inlineModel, script, nameSuffix) {\r
+       /*  AngelH, mar2007\r
+               Fixed percent / pixel business, to avoid browser errors:\r
+               put "px" where needed, avoid where not.\r
+\r
+           Bob Hanson, 1/2010\r
+               Fixed inline escape changing returns to |               \r
+       */\r
+  with (_jmol) {\r
+    nameSuffix == undefined && (nameSuffix = appletCount);\r
+    appletSuffixes.push(nameSuffix);\r
+    ++appletCount;\r
+    script || (script = "select *");\r
+    var sz = _jmolGetAppletSize(size);\r
+    var widthAndHeight = " width='" + sz[0] + "' height='" + sz[1] + "' ";\r
+    var tHeader, tFooter;\r
+    codebase || jmolInitialize(".");\r
+    if (useIEObject || useHtml4Object) {\r
+      params.archive = archivePath;\r
+      params.mayscript = 'true';\r
+      params.codebase = codebase;\r
+      params.code = 'JmolApplet';\r
+      tHeader = \r
+        "<object name='jmolApplet" + nameSuffix +\r
+        "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +\r
+                               widthAndHeight + "\n";\r
+      tFooter = "</object>";\r
+    }\r
+    if (java_arguments)\r
+      params.java_arguments = java_arguments;\r
+    if (useIEObject) { // use MSFT IE6 object tag with .cab file reference\r
+      tHeader += " classid='" + windowsClassId + "'\n" +\r
+      (windowsCabUrl ? " codebase='" + windowsCabUrl + "'\n" : "") + ">\n";\r
+    } else if (useHtml4Object) { // use HTML4 object tag\r
+      tHeader += " type='application/x-java-applet'\n>\n";\r
+                               /*      " classid='java:JmolApplet'\n" +        AH removed this\r
+                                 Chromium Issue 62076:         Java Applets using an <object> with a classid paramater don't load.\r
+                                       http://code.google.com/p/chromium/issues/detail?id=62076\r
+                                       They say this is the correct behavior according to the spec, and there's no indication at this point \r
+                                       that WebKit will be changing the handling, so eventually Safari will acquire this behavior too.\r
+                                       Removing the classid parameter seems to be well tolerated by all browsers (even IE!).\r
+                               */\r
+    } else { // use applet tag\r
+      tHeader = \r
+        "<applet name='jmolApplet" + nameSuffix +\r
+        "' id='jmolApplet" + nameSuffix + "' " + appletCssText + "\n" +\r
+                               widthAndHeight + "\n" +\r
+        " code='JmolApplet'" +\r
+        " archive='" + archivePath + "' codebase='" + codebase + "'\n" +\r
+        " mayscript='true'>\n";\r
+      tFooter = "</applet>";\r
+    }\r
+    var visitJava;\r
+    if (useIEObject || useHtml4Object) {\r
+               var szX = "width:" + sz[0]\r
+               if ( szX.indexOf("%")==-1 ) szX+="px" \r
+               var szY = "height:" + sz[1]\r
+               if ( szY.indexOf("%")==-1 ) szY+="px" \r
+      visitJava =\r
+        "<p style='background-color:yellow; color:black; " +\r
+               szX + ";" + szY + ";" +\r
+        // why doesn't this vertical-align work?\r
+       "text-align:center;vertical-align:middle;'>\n" +\r
+               noJavaMsg +\r
+        "</p>";\r
+    } else {\r
+      visitJava =\r
+        "<table bgcolor='yellow'><tr>" +\r
+        "<td align='center' valign='middle' " + widthAndHeight + "><font color='black'>\n" +\r
+               noJavaMsg2 +\r
+        "</font></td></tr></table>";\r
+    }\r
+    params.loadInline = (inlineModel ? inlineModel : "");\r
+    params.script = (script ? _jmolSterilizeScript(script) : "");\r
+    var t = tHeader + _jmolParams() + visitJava + tFooter;\r
+    jmolSetTarget(nameSuffix);\r
+    ready["jmolApplet" + nameSuffix] = false;\r
+    if (_jmol.debugAlert)\r
+      alert(t);\r
+    return _jmolDocumentWrite(t);\r
+  }\r
+}\r
+\r
+function _jmolParams() {\r
+ var t = "";\r
+ for (var i in _jmol.params)\r
+       if(_jmol.params[i]!="")\r
+                t+="  <param name='"+i+"' value='"+_jmol.params[i]+"' />\n";\r
+ return t\r
+}\r
+\r
+function _jmolInitCheck() {\r
+  if (_jmol.initChecked)\r
+    return;\r
+  _jmol.initChecked = true;\r
+  jmolInitialize(defaultdir, defaultjar)\r
+}\r
+\r
+function _jmolCheckBrowser() {\r
+  with (_jmol) {\r
+    if (browserChecked)\r
+      return;\r
+    browserChecked = true;\r
+  \r
+    if (isFullyCompliant)\r
+      return true;\r
+\r
+    if (checkBrowserAction == "redirect")\r
+      location.href = checkBrowserUrlOrMessage;\r
+    else if (checkBrowserAction == "popup")\r
+      _jmolPopup(checkBrowserUrlOrMessage);\r
+    else {\r
+      var msg = checkBrowserUrlOrMessage;\r
+      if (msg == null)\r
+        msg = "Your web browser is not fully compatible with Jmol\n\n" +\r
+              "browser: " + browser +\r
+              "   version: " + browserVersion +\r
+              "   os: " + os +\r
+              "   isBrowserCompliant: " + isBrowserCompliant +\r
+              "   isJavaCompliant: " + isJavaCompliant +\r
+              "\n\n" + ua;\r
+      alert(msg);\r
+    }\r
+  }\r
+  return false;\r
+}\r
+\r
+function jmolSetXHTML(id) {\r
+       _jmol.isXHTML = true\r
+       _jmol.XhtmlElement = null\r
+       _jmol.XhtmlAppendChild = false\r
+       if (id){\r
+               _jmol.XhtmlElement = document.getElementById(id)\r
+               _jmol.XhtmlAppendChild = true\r
+       }\r
+}\r
+\r
+function _jmolDocumentWrite(text) {\r
+       if (_jmol.currentDocument) {\r
+               if (_jmol.isXHTML && !_jmol.XhtmlElement) {\r
+                       var s = document.getElementsByTagName("script")\r
+                       _jmol.XhtmlElement = s.item(s.length - 1)\r
+                       _jmol.XhtmlAppendChild = false\r
+               }\r
+               if (_jmol.XhtmlElement) {\r
+                       _jmolDomDocumentWrite(text)\r
+               } else {\r
+                       _jmol.currentDocument.write(text);\r
+               }\r
+       }\r
+       return text;\r
+}\r
+\r
+function _jmolDomDocumentWrite(data) {\r
+       var pt = 0\r
+       var Ptr = []\r
+       Ptr[0] = 0\r
+       while (Ptr[0] < data.length) {\r
+               var child = _jmolGetDomElement(data, Ptr)\r
+               if (!child)break\r
+               if (_jmol.XhtmlAppendChild)\r
+                       _jmol.XhtmlElement.appendChild(child)\r
+               else\r
+                       _jmol.XhtmlElement.parentNode.insertBefore(child, _jmol.XhtmlElement); \r
+       }\r
+}\r
+function _jmolGetDomElement(data, Ptr, closetag, lvel) {\r
+       var e = document.createElement("span")\r
+       e.innerHTML = data\r
+       Ptr[0] = data.length\r
+       return e\r
+\r
+//unnecessary?\r
+\r
+       closetag || (closetag = "")\r
+       lvel || (lvel = 0)\r
+       var pt0 = Ptr[0]\r
+       var pt = pt0\r
+       while (pt < data.length && data.charAt(pt) != "<") pt++\r
+       if (pt != pt0) {\r
+               var text = data.substring(pt0, pt)\r
+               Ptr[0] = pt\r
+               return document.createTextNode(text)\r
+       }       \r
+       pt0 = ++pt\r
+       var ch\r
+       while (pt < data.length && "\n\r\t >".indexOf(ch = data.charAt(pt)) < 0) pt++\r
+       var tagname = data.substring(pt0, pt)\r
+       var e = (tagname == closetag  || tagname == "/" ? "" \r
+               : document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tagname)\r
+               : document.createElement(tagname));\r
+       if (ch == ">") {\r
+               Ptr[0] = ++pt\r
+               return e\r
+       }\r
+       while (pt < data.length && (ch = data.charAt(pt)) != ">") {\r
+               while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++\r
+               pt0 = pt\r
+               while (pt < data.length && "\n\r\t =/>".indexOf(ch = data.charAt(pt)) < 0) pt++\r
+               var attrname = data.substring(pt0, pt).toLowerCase()\r
+               if (attrname && ch != "=") \r
+                       e.setAttribute(attrname, "true")\r
+               while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++\r
+               if (ch == "/") {\r
+                       Ptr[0] = pt + 2\r
+                       return e\r
+               } else if (ch == "=") {\r
+                       var quote = data.charAt(++pt)\r
+                       pt0 = ++pt\r
+                       while (pt < data.length && (ch = data.charAt(pt)) != quote) pt++\r
+                       var attrvalue = data.substring(pt0, pt)\r
+                       e.setAttribute(attrname, attrvalue)\r
+                       pt++\r
+               }\r
+       }\r
+       Ptr[0] = ++pt\r
+       while (Ptr[0] < data.length) {\r
+               var child = _jmolGetDomElement(data, Ptr, "/" + tagname, lvel+1)\r
+               if (!child)break\r
+               e.appendChild(child)\r
+       }\r
+       return e\r
+}\r
+\r
+function _jmolPopup(url) {\r
+  var popup = window.open(url, "JmolPopup",\r
+                          "left=150,top=150,height=400,width=600," +\r
+                          "directories=yes,location=yes,menubar=yes," +\r
+                          "toolbar=yes," +\r
+                          "resizable=yes,scrollbars=yes,status=yes");\r
+  if (popup.focus)\r
+    poup.focus();\r
+}\r
+\r
+function _jmolReadyCallback(name) {\r
+  if (_jmol.debugAlert)\r
+    alert(name + " is ready");\r
+  _jmol.ready["" + name] = true;\r
+}\r
+\r
+function _jmolSterilizeScript(script) {\r
+  script = script.replace(/'/g, "&#39;");\r
+  if (_jmol.debugAlert)\r
+    alert("script:\n" + script);\r
+  return script;\r
+}\r
+\r
+function _jmolSterilizeInline(model) {\r
+  model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "&#39;");\r
+  if (_jmol.debugAlert)\r
+    alert("inline model:\n" + model);\r
+  return model;\r
+}\r
+\r
+function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) {\r
+  ++_jmol.radioCount;\r
+  groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1));\r
+  if (!script)\r
+    return "";\r
+  labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32));\r
+  separatorHtml || (separatorHtml = "")\r
+  var scriptIndex = _jmolAddScript(script);\r
+  var eospan = "</span>"\r
+  var t = "<span id=\"span_"+id+"\""+(title ? " title=\"" + title + "\"":"")+"><input name='" \r
+       + groupName + "' id='"+id+"' type='radio' onclick='_jmolClick(this," +\r
+         scriptIndex + _jmol.targetText + ");return true;' onmouseover='_jmolMouseOver(" +\r
+         scriptIndex + ");return true;' onmouseout='_jmolMouseOut()' " +\r
+        (isChecked ? "checked='true' " : "") + _jmol.radioCssText + " />"\r
+  if (labelHtml.toLowerCase().indexOf("<td>")>=0) {\r
+       t += eospan\r
+       eospan = "";\r
+  }\r
+  t += "<label for=\"" + id + "\">" + labelHtml + "</label>" +eospan + separatorHtml;\r
+\r
+  return t;\r
+}\r
+\r
+function _jmolFindApplet(target) {\r
+  // first look for the target in the current window\r
+  var applet = _jmolFindAppletInWindow(_jmol.appletWindow != null ? _jmol.appletWindow : window, target);\r
+  // THEN look for the target in child frames\r
+  if (applet == undefined)\r
+    applet = _jmolSearchFrames(window, target);\r
+  // FINALLY look for the target in sibling frames\r
+  if (applet == undefined)\r
+    applet = _jmolSearchFrames(top, target); // look starting in top frame\r
+  return applet;\r
+}\r
+\r
+function _jmolGetApplet(targetSuffix){\r
+ var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0");\r
+ var applet = _jmolFindApplet(target);\r
+ if (applet) return applet\r
+ _jmol.alerted || alert("could not find applet " + target);\r
+ _jmol.alerted = true;\r
+ return null\r
+}\r
+\r
+function _jmolSearchFrames(win, target) {\r
+  var applet;\r
+  var frames = win.frames;\r
+  if (frames && frames.length) { // look in all the frames below this window\r
+   try{\r
+    for (var i = 0; i < frames.length; ++i) {\r
+      applet = _jmolSearchFrames(frames[i], target);\r
+      if (applet)\r
+        return applet;\r
+    }\r
+   }catch(e) {\r
+       if (_jmol.debugAlert)\r
+               alert("Jmol.js _jmolSearchFrames cannot access " + win.name + ".frame[" + i + "] consider using jmolSetAppletWindow()") \r
+   }\r
+  }\r
+  return applet = _jmolFindAppletInWindow(win, target)\r
+}\r
+\r
+function _jmolFindAppletInWindow(win, target) {\r
+    var doc = win.document;\r
+               if (doc.getElementById(target))\r
+      return doc.getElementById(target);\r
+    else if (doc.applets)\r
+      return doc.applets[target];\r
+    else\r
+      return doc[target]; \r
+}\r
+\r
+function _jmolAddScript(script) {\r
+  if (!script)\r
+    return 0;\r
+  var index = _jmol.scripts.length;\r
+  _jmol.scripts[index] = script;\r
+  return index;\r
+}\r
+\r
+function _jmolClick(elementClicked, scriptIndex, targetSuffix) {\r
+  _jmol.element = elementClicked;\r
+  _jmolScriptExecute(elementClicked, _jmol.scripts[scriptIndex], targetSuffix);\r
+}\r
+\r
+function _jmolMenuSelected(menuObject, targetSuffix) {\r
+  var scriptIndex = menuObject.value;\r
+  if (scriptIndex != undefined) {\r
+    _jmolScriptExecute(menuObject, _jmol.scripts[scriptIndex], targetSuffix);\r
+    return;\r
+  }\r
+  var len = menuObject.length;\r
+  if (typeof len == "number") {\r
+    for (var i = 0; i < len; ++i) {\r
+      if (menuObject[i].selected) {\r
+        _jmolClick(menuObject[i], menuObject[i].value, targetSuffix);\r
+       return;\r
+      }\r
+    }\r
+  }\r
+  alert("?Que? menu selected bug #8734");\r
+}\r
+\r
+\r
+_jmol.checkboxMasters = {};\r
+_jmol.checkboxItems = {};\r
+\r
+function jmolSetCheckboxGroup(chkMaster,chkBox) {\r
+       var id = chkMaster;\r
+       if(typeof(id)=="number")id = "jmolCheckbox" + id;\r
+       chkMaster = document.getElementById(id);\r
+       if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id);\r
+       var m = _jmol.checkboxMasters[id] = {};\r
+       m.chkMaster = chkMaster;\r
+       m.chkGroup = {};\r
+       for (var i = 1; i < arguments.length; i++){\r
+               var id = arguments[i];\r
+               if(typeof(id)=="number")id = "jmolCheckbox" + id;\r
+               checkboxItem = document.getElementById(id);\r
+               if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id);\r
+               m.chkGroup[id] = checkboxItem;\r
+               _jmol.checkboxItems[id] = m;\r
+       }\r
+}\r
+\r
+function _jmolNotifyMaster(m){\r
+       //called when a group item is checked\r
+       var allOn = true;\r
+       var allOff = true;\r
+       for (var chkBox in m.chkGroup){\r
+               if(m.chkGroup[chkBox].checked)\r
+                       allOff = false;\r
+               else\r
+                       allOn = false;\r
+       }\r
+       if (allOn)m.chkMaster.checked = true;   \r
+       if (allOff)m.chkMaster.checked = false;\r
+       if ((allOn || allOff) && _jmol.checkboxItems[m.chkMaster.id])\r
+               _jmolNotifyMaster(_jmol.checkboxItems[m.chkMaster.id])\r
+}\r
+\r
+function _jmolNotifyGroup(m, isOn){\r
+       //called when a master item is checked\r
+       for (var chkBox in m.chkGroup){\r
+               var item = m.chkGroup[chkBox]\r
+               item.checked = isOn;\r
+               if (_jmol.checkboxMasters[item.id])\r
+                       _jmolNotifyGroup(_jmol.checkboxMasters[item.id], isOn)\r
+       }\r
+}\r
+\r
+function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) {\r
+  _jmol.control = ckbox\r
+  _jmolClick(ckbox, ckbox.checked ? whenChecked : whenUnchecked, targetSuffix);\r
+  if(_jmol.checkboxMasters[ckbox.id])\r
+       _jmolNotifyGroup(_jmol.checkboxMasters[ckbox.id], ckbox.checked)\r
+  if(_jmol.checkboxItems[ckbox.id])\r
+       _jmolNotifyMaster(_jmol.checkboxItems[ckbox.id])\r
+}\r
+\r
+function _jmolCbOver(ckbox, whenChecked, whenUnchecked) {\r
+  window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked];\r
+}\r
+\r
+function _jmolMouseOver(scriptIndex) {\r
+  window.status = _jmol.scripts[scriptIndex];\r
+}\r
+\r
+function _jmolMouseOut() {\r
+  window.status = " ";\r
+  return true;\r
+}\r
+\r
+function _jmolSetCodebase(codebase) {\r
+  _jmol.codebase = codebase ? codebase : ".";\r
+  if (_jmol.debugAlert)\r
+    alert("jmolCodebase=" + _jmol.codebase);\r
+}\r
+\r
+function _jmolOnloadResetForms() {\r
+  // must be evaluated ONLY once\r
+  _jmol.previousOnloadHandler = window.onload;\r
+  window.onload =\r
+  function() {\r
+    with (_jmol) {\r
+      if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) {\r
+        var forms = document.forms;\r
+        for (var i = forms.length; --i >= 0; )\r
+          forms[i].reset();\r
+      }\r
+      if (previousOnloadHandler)\r
+        previousOnloadHandler();\r
+    }\r
+  }\r
+}\r
+\r
+////////////////////////////////////\r
+/////extensions for getProperty/////\r
+////////////////////////////////////\r
+\r
+\r
+function _jmolEvalJSON(s,key){\r
+ s=s+""\r
+ if(!s)return []\r
+ if(s.charAt(0)!="{"){\r
+       if(s.indexOf(" | ")>=0)s=s.replace(/\ \|\ /g, "\n")\r
+       return s\r
+ }\r
+ var A = eval("("+s+")")\r
+ if(!A)return\r
+ if(key && A[key])A=A[key]\r
+ return A\r
+}\r
+\r
+function _jmolEnumerateObject(A,key){\r
+ var sout=""\r
+ if(typeof(A) == "string" && A!="null"){\r
+       sout+="\n"+key+"=\""+A+"\""\r
+ }else if(!isNaN(A)||A==null){\r
+       sout+="\n"+key+"="+(A+""==""?"null":A)\r
+ }else if(A.length){\r
+    sout+=key+"=[]"\r
+    for(var i=0;i<A.length;i++){\r
+       sout+="\n"\r
+       if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){\r
+               sout+=_jmolEnumerateObject(A[i],key+"["+i+"]")\r
+       }else{\r
+               sout+=key+"["+i+"]="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])\r
+       }\r
+    }\r
+ }else{\r
+    if(key != ""){\r
+       sout+=key+"={}"\r
+       key+="."\r
+    }\r
+    \r
+    for(var i in A){\r
+       sout+="\n"\r
+       if(typeof(A[i]) == "object"||typeof(A[i]) == "array"){\r
+               sout+=_jmolEnumerateObject(A[i],key+i)\r
+       }else{\r
+               sout+=key+i+"="+(typeof(A[i]) == "string" && A[i]!="null"?"\""+A[i].replace(/\"/g,"\\\"")+"\"":A[i])\r
+       }\r
+    }\r
+ } \r
+ return sout\r
+}\r
+\r
+\r
+function _jmolSortKey0(a,b){\r
+ return (a[0]<b[0]?1:a[0]>b[0]?-1:0)\r
+}\r
+\r
+function _jmolSortMessages(A){\r
+ if(!A || typeof(A)!="object")return []\r
+ var B = []\r
+ for(var i=A.length-1;i>=0;i--)for(var j=0;j<A[i].length;j++)B[B.length]=A[i][j]\r
+ if(B.length == 0) return\r
+ B=B.sort(_jmolSortKey0)\r
+ return B\r
+}\r
+\r
+/////////additional extensions //////////\r
+\r
+\r
+function _jmolDomScriptLoad(URL){\r
+ //open(URL) //to debug\r
+ _jmol.servercall=URL\r
+ var node = document.getElementById("_jmolScriptNode")\r
+ if (node && _jmol.browser!="msie"){\r
+    document.getElementsByTagName("HEAD")[0].removeChild(node)\r
+    node=null\r
+ }\r
+ if (node) {\r
+   node.setAttribute("src",URL)\r
+ } else {\r
+   node=document.createElement("script")\r
+   node.setAttribute("id","_jmolScriptNode")\r
+   node.setAttribute("type","text/javascript")\r
+   node.setAttribute("src",URL)\r
+   document.getElementsByTagName("HEAD")[0].appendChild(node)\r
+ }\r
+}\r
+\r
+\r
+function _jmolExtractPostData(url){\r
+ S=url.split("&POST:")\r
+ var s=""\r
+ for(var i=1;i<S.length;i++){\r
+       KV=S[i].split("=")\r
+       s+="&POSTKEY"+i+"="+KV[0]\r
+       s+="&POSTVALUE"+i+"="+KV[1]\r
+ }\r
+ return "&url="+escape(S[0])+s\r
+}\r
+\r
+function _jmolLoadModel(targetSuffix,remoteURL,array,isError,errorMessage){\r
+ //called by server, but in client\r
+ //overload this function to customize return\r
+ _jmol.remoteURL=remoteURL\r
+ isError && alert(errorMessage)\r
+ jmolLoadInlineScript(array.join("\n"),_jmol.optionalscript,targetSuffix)\r
+}\r
+\r
+//////////user property/status functions/////////\r
+\r
+function jmolGetStatus(strStatus,targetSuffix){\r
+ return _jmolSortMessages(jmolGetPropertyAsArray("jmolStatus",strStatus,targetSuffix))\r
+}\r
+\r
+function jmolGetPropertyAsArray(sKey,sValue,targetSuffix) {\r
+ return _jmolEvalJSON(jmolGetPropertyAsJSON(sKey,sValue,targetSuffix),sKey)\r
+}\r
+\r
+function jmolGetPropertyAsString(sKey,sValue,targetSuffix) {\r
+ var applet = _jmolGetApplet(targetSuffix);\r
+ sValue == undefined && (sValue="");\r
+ return (applet ? applet.getPropertyAsString(sKey,sValue) + "" : "")\r
+}\r
+\r
+function jmolGetPropertyAsJSON(sKey,sValue,targetSuffix) {\r
+ sValue == undefined && (sValue = "")\r
+ var applet = _jmolGetApplet(targetSuffix);\r
+ try {\r
+  return (applet ? applet.getPropertyAsJSON(sKey,sValue) + "" : "")\r
+ } catch(e) {\r
+  return ""\r
+ }\r
+}\r
+\r
+function jmolGetPropertyAsJavaObject(sKey,sValue,targetSuffix) {\r
+ sValue == undefined && (sValue = "")\r
+ var applet = _jmolGetApplet(targetSuffix);\r
+ return (applet ? applet.getProperty(sKey,sValue) : null)\r
+}\r
+\r
+\r
+function jmolDecodeJSON(s) {\r
+ return _jmolEnumerateObject(_jmolEvalJSON(s),"")\r
+}\r
+\r
+\r
+///////// synchronous scripting ////////\r
+\r
+function jmolScriptWait(script, targetSuffix) {\r
+  targetSuffix == undefined && (targetSuffix="0")\r
+  var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
+  var s = ""\r
+  for(var i=Ret.length;--i>=0;)\r
+  for(var j=0;j< Ret[i].length;j++)\r
+       s+=Ret[i][j]+"\n"\r
+  return s\r
+}\r
+\r
+function jmolScriptWaitOutput(script, targetSuffix) {\r
+  targetSuffix == undefined && (targetSuffix="0")\r
+  var ret = ""\r
+  try{\r
+   if (script) {\r
+    _jmolCheckBrowser();\r
+    var applet=_jmolGetApplet(targetSuffix);\r
+    if (applet) ret += applet.scriptWaitOutput(script);\r
+   }\r
+  }catch(e){\r
+  }\r
+ return ret;\r
+}\r
+\r
+function jmolEvaluate(molecularMath, targetSuffix) {\r
+\r
+  //carries out molecular math on a model\r
+\r
+  targetSuffix == undefined && (targetSuffix="0")\r
+  var result = "" + jmolGetPropertyAsJavaObject("evaluate", molecularMath, targetSuffix);\r
+  var s = result.replace(/\-*\d+/,"")\r
+  if (s == "" && !isNaN(parseInt(result)))return parseInt(result);\r
+  var s = result.replace(/\-*\d*\.\d*/,"")\r
+  if (s == "" && !isNaN(parseFloat(result)))return parseFloat(result);\r
+  return result;\r
+}\r
+\r
+function jmolScriptEcho(script, targetSuffix) {\r
+  // returns a newline-separated list of all echos from a script\r
+  targetSuffix == undefined && (targetSuffix="0")\r
+  var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
+  var s = ""\r
+  for(var i=Ret.length;--i>=0;)\r
+  for(var j=Ret[i].length;--j>=0;)\r
+        if (Ret[i][j][1] == "scriptEcho")s+=Ret[i][j][3]+"\n"\r
+  return s.replace(/ \| /g, "\n")\r
+}\r
+\r
+\r
+function jmolScriptMessage(script, targetSuffix) {\r
+  // returns a newline-separated list of all messages from a script, ending with "script completed\n"\r
+  targetSuffix == undefined && (targetSuffix="0")\r
+  var Ret=jmolScriptWaitAsArray(script, targetSuffix)\r
+  var s = ""\r
+  for(var i=Ret.length;--i>=0;)\r
+  for(var j=Ret[i].length;--j>=0;)\r
+        if (Ret[i][j][1] == "scriptStatus")s+=Ret[i][j][3]+"\n"\r
+  return s.replace(/ \| /g, "\n")\r
+}\r
+\r
+\r
+function jmolScriptWaitAsArray(script, targetSuffix) {\r
+ var ret = ""\r
+ try{\r
+  jmolGetStatus("scriptEcho,scriptMessage,scriptStatus,scriptError",targetSuffix)\r
+  if (script) {\r
+    _jmolCheckBrowser();\r
+    var applet=_jmolGetApplet(targetSuffix);\r
+    if (applet) ret += applet.scriptWait(script);\r
+    ret = _jmolEvalJSON(ret,"jmolStatus")\r
+    if(typeof ret == "object")\r
+       return ret\r
+  }\r
+ }catch(e){\r
+ }\r
+  return [[ret]]\r
+}\r
+\r
+\r
+\r
+////////////   save/restore orientation   /////////////\r
+\r
+function jmolSaveOrientation(id, targetSuffix) {  \r
+ targetSuffix == undefined && (targetSuffix="0")\r
+ return _jmol["savedOrientation"+id] = jmolGetPropertyAsArray("orientationInfo","info",targetSuffix).moveTo\r
+}\r
+\r
+function jmolRestoreOrientation(id, targetSuffix) {\r
+ targetSuffix == undefined && (targetSuffix="0")\r
+ var s=_jmol["savedOrientation"+id]\r
+ if (!s || s == "")return\r
+ s=s.replace(/1\.0/,"0")\r
+ return jmolScriptWait(s,targetSuffix)\r
+}\r
+\r
+function jmolRestoreOrientationDelayed(id, delay, targetSuffix) {\r
+ arguments.length < 2 && (delay=1)\r
+ targetSuffix == undefined && (targetSuffix="0")\r
+ var s=_jmol["savedOrientation"+id]\r
+ if (!s || s == "")return\r
+ s=s.replace(/1\.0/,delay)\r
+ return jmolScriptWait(s,targetSuffix)\r
+}\r
+\r
+////////////  add parameter /////////////\r
+/*\r
+ * for adding callbacks or other parameters. Use:\r
+\r
+   jmolSetDocument(0)\r
+   var s= jmolApplet(....)\r
+   s = jmolAppletAddParam(s,"messageCallback", "myFunctionName")\r
+   document.write(s)\r
+   jmolSetDocument(document) // if you want to then write buttons and such normally\r
\r
+ */\r
+\r
+function jmolAppletAddParam(appletCode,name,value){\r
+  return (value == "" ? appletCode : appletCode.replace(/\<param/,"\n<param name='"+name+"' value='"+value+"' />\n<param"))\r
+}\r
+\r
+///////////////auto load Research Consortium for Structural Biology (RCSB) data ///////////\r
+\r
+function jmolLoadAjax_STOLAF_RCSB(fileformat,pdbid,optionalscript,targetSuffix){\r
+\r
+ _jmol.thismodel || (_jmol.thismodel = "1crn")\r
+ _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")\r
+ _jmol.RCSBserver || (_jmol.RCSBserver="http://www.rcsb.org")\r
+ _jmol.defaultURL_RCSB || (_jmol.defaultURL_RCSB=_jmol.RCSBserver+"/pdb/files/1CRN.CIF")\r
+ fileformat || (fileformat="PDB")\r
+ pdbid || (pdbid=prompt("Enter a 4-digit PDB ID:",_jmol.thismodel))\r
+ if(!pdbid || pdbid.length != 4)return ""\r
+ targetSuffix || (targetSuffix="0")\r
+ optionalscript || (optionalscript="")\r
+ var url=_jmol.defaultURL_RCSB.replace(/1CRN/g,pdbid.toUpperCase())\r
+ fileformat=="CIF" || (url=url.replace(/CIF/,fileformat))\r
+ _jmol.optionalscript=optionalscript\r
+ _jmol.thismodel=pdbid\r
+ _jmol.thistargetsuffix=targetSuffix\r
+ _jmol.thisurl=url\r
+ _jmol.modelArray = []\r
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
+ _jmolDomScriptLoad(url)\r
+ return url\r
+}\r
+\r
+\r
+///////////////auto load NIH CACTVS data -- compound name or SMILES ///////////\r
+\r
+function jmolLoadAjax_STOLAF_NIH(compoundid,optionalscript,targetSuffix){\r
+ _jmol.thismodel || (_jmol.thismodel = "aspirin")\r
+ _jmol.serverURL || (_jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm")\r
+ _jmol.defaultURL_NIH || (_jmol.defaultURL_NIH="http://cactus.nci.nih.gov/chemical/structure/FILE/file?format=sdf&get3d=True")\r
+ compoundid || (compoundid=prompt("Enter a compound name or a SMILES string:",_jmol.thismodel))\r
+ if(!compoundid)return ""\r
+ targetSuffix || (targetSuffix="0")\r
+ optionalscript || (optionalscript="")\r
+ var url=_jmol.defaultURL_NIH.replace(/FILE/g,compoundid)\r
+ _jmol.optionalscript=optionalscript\r
+ _jmol.thismodel=compoundid\r
+ _jmol.thistargetsuffix=targetSuffix\r
+ _jmol.thisurl=url\r
+ _jmol.modelArray = []\r
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
+ _jmolDomScriptLoad(url)\r
+ return url\r
+}\r
+\r
+\r
+/////////////// St. Olaf College AJAX server -- ANY URL ///////////\r
+\r
+function jmolLoadAjax_STOLAF_ANY(url, userid, optionalscript,targetSuffix){\r
+ _jmol.serverURL="http://fusion.stolaf.edu/chemistry/jmol/getajaxjs.cfm"\r
+ _jmol.thisurlANY || (_jmol.thisurlANY = "http://www.stolaf.edu/depts/chemistry/mo/struc/data/ycp3-1.mol")\r
+ url || (url=prompt("Enter any (uncompressed file) URL:", _jmol.thisurlANY))\r
+ userid || (userid="0")\r
+ targetSuffix || (targetSuffix="0")\r
+ optionalscript || (optionalscript="")\r
+ _jmol.optionalscript=optionalscript\r
+ _jmol.thistargetsuffix=targetSuffix\r
+ _jmol.modelArray = []\r
+ _jmol.thisurl = url\r
+ url=_jmol.serverURL+"?returnfunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix+_jmolExtractPostData(url)\r
+ _jmolDomScriptLoad(url)\r
+}\r
+\r
+\r
+/////////////// Mineralogical Society of America (MSA) data /////////\r
+\r
+function jmolLoadAjax_MSA(key,value,optionalscript,targetSuffix){\r
+\r
+ _jmol.thiskeyMSA || (_jmol.thiskeyMSA = "mineral")\r
+ _jmol.thismodelMSA || (_jmol.thismodelMSA = "quartz")\r
+ _jmol.ajaxURL_MSA || (_jmol.ajaxURL_MSA="http://rruff.geo.arizona.edu/AMS/result.php?mineral=quartz&viewing=ajaxjs")\r
+ key || (key=prompt("Enter a field:", _jmol.thiskeyMSA))\r
+ if(!key)return ""\r
+ value || (value=prompt("Enter a "+key+":", _jmol.thismodelMSA))\r
+ if(!value)return ""\r
+ targetSuffix || (targetSuffix="0")\r
+ optionalscript || (optionalscript="")\r
+ optionalscript == 1 && (optionalscript='load "" {1 1 1}')\r
+ var url=_jmol.ajaxURL_MSA.replace(/mineral/g,key).replace(/quartz/g,value)\r
+ _jmol.optionalscript=optionalscript\r
+ _jmol.thiskeyMSA=key\r
+ _jmol.thismodelMSA=value\r
+ _jmol.thistargetsuffix=targetSuffix\r
+ _jmol.thisurl=url\r
+ _jmol.modelArray = []\r
+ loadModel=_jmolLoadModel\r
+ _jmolDomScriptLoad(url)\r
+ return url\r
+}\r
+\r
+\r
+\r
+function jmolLoadAjaxJS(url, userid, optionalscript,targetSuffix){\r
+ userid || (userid="0")\r
+ targetSuffix || (targetSuffix="0")\r
+ optionalscript || (optionalscript="")\r
+ _jmol.optionalscript=optionalscript\r
+ _jmol.thismodel=userid\r
+ _jmol.thistargetsuffix=targetSuffix\r
+ _jmol.modelArray = []\r
+ _jmol.thisurl = url\r
+ url+="&returnFunction=_jmolLoadModel&returnArray=_jmol.modelArray&id="+targetSuffix\r
+ _jmolDomScriptLoad(url)\r
+}\r
+\r
+\r
+//// in case Jmol library has already been loaded:\r
+\r
+}catch(e){}\r
+\r
+///////////////moving atoms //////////////\r
+\r
+// HIGHLY experimental!!\r
+\r
+function jmolSetAtomCoord(i,x,y,z,targetSuffix){\r
+    _jmolCheckBrowser();\r
+      var applet=_jmolGetApplet(targetSuffix);\r
+      if (applet) applet.getProperty('jmolViewer').setAtomCoord(i,x,y,z)\r
+}\r
+\r
+function jmolSetAtomCoordRelative(i,x,y,z,targetSuffix){\r
+    _jmolCheckBrowser();\r
+      var applet=_jmolGetApplet(targetSuffix);\r
+      if (applet) applet.getProperty('jmolViewer').setAtomCoordRelative(i,x,y,z)\r
+}\r
+\r
+\r
+///////////////applet fake for testing buttons/////////////\r
+\r
+\r
+if(_jmol.useNoApplet){\r
+       jmolApplet = function(w){\r
+               var s="<table style='background-color:black' width="+w+"><tr height="+w+">"\r
+               +"<td align=center valign=center style='background-color:white'>"\r
+               +"Applet would be here"\r
+               +"<p><textarea id=fakeApplet rows=5 cols=50></textarea>"\r
+               +"</td></tr></table>"\r
+               return _jmolDocumentWrite(s)\r
+       }\r
+\r
+       _jmolFindApplet = function(){return jmolApplet0}\r
+\r
+       jmolApplet0 = {\r
+        script: function(script){document.getElementById("fakeApplet").value="\njmolScript:\n"+script}\r
+       ,scriptWait: function(script){document.getElementById("fakeApplet").value="\njmolScriptWait:\n"+script} \r
+       ,loadInline: function(data,script){document.getElementById("fakeApplet").value="\njmolLoadInline data:\n"+data+"\n\nscript:\n"+script}\r
+       }\r
+}\r
+\r
+\r
+///////////////////////////////////////////\r
+\r
+  //  This should no longer be needed, jmolResizeApplet() is better; kept for backwards compatibility\r
+  /*\r
+       Resizes absolutely (pixels) or by percent of window (w or h 0.5 means 50%).\r
+       targetSuffix is optional and defaults to zero (first applet in page).\r
+       Both w and h are optional, but needed if you want to use targetSuffix.\r
+               h defaults to w\r
+               w defaults to 100% of window\r
+       If either w or h is between 0 and 1, then it is taken as percent/100.\r
+       If either w or h is greater than 1, then it is taken as a size (pixels). \r
+       */\r
+function jmolResize(w,h,targetSuffix) {\r
+ _jmol.alerted = true;\r
+ var percentW = (!w ? 100 : w <= 1  && w > 0 ? w * 100 : 0);\r
+ var percentH = (!h ? percentW : h <= 1 && h > 0 ? h * 100 : 0);\r
+ if (_jmol.browser=="msie") {\r
+   var width=document.body.clientWidth;\r
+   var height=document.body.clientHeight;\r
+ } else {\r
+   var netscapeScrollWidth=15;\r
+   var width=window.innerWidth - netscapeScrollWidth;\r
+   var height=window.innerHeight-netscapeScrollWidth;\r
+ }\r
+ var applet = _jmolGetApplet(targetSuffix);\r
+ if(!applet)return;\r
+ applet.style.width = (percentW ? width * percentW/100 : w)+"px";\r
+ applet.style.height = (percentH ? height * percentH/100 : (h ? h : w))+"px";\r
+ //title=width +  " " + height + " " + (new Date());\r
+}\r
+\r
+// 13 Jun 09 -- makes jmolResize() obsolete  (kept for backwards compatibility)\r
+function jmolResizeApplet(size,targetSuffix) {\r
+ // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()]\r
+ //  Special case: an empty value for width or height is accepted, meaning no change in that dimension.\r
+ _jmol.alerted = true;\r
+ var applet = _jmolGetApplet(targetSuffix);\r
+ if(!applet)return;\r
+ var sz = _jmolGetAppletSize(size, "px");\r
+ sz[0] && (applet.style.width = sz[0]);\r
+ sz[1] && (applet.style.height = sz[1]);\r
+}\r
+\r
+function _jmolGetAppletSize(size, units) {\r
+       /* Accepts single number or 2-value array, each one can be one of:\r
+          percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.)\r
+          [width, height] array of strings is returned, with units added if specified.\r
+          Percent is relative to container div or element (which should have explicitly set size).\r
+       */\r
+  var width, height;\r
+  if ( (typeof size) == "object" && size != null ) {\r
+    width = size[0]; height = size[1];\r
+  } else {\r
+    width = height = size;\r
+  }\r
+  return [_jmolFixDim(width, units), _jmolFixDim(height, units)];\r
+}\r
+\r
+function _jmolFixDim(x, units) {\r
+  var sx = "" + x;\r
+  return (sx.length == 0 ? (units ? "" : _jmol.allowedJmolSize[2])\r
+       : sx.indexOf("%") == sx.length-1 ? sx \r
+       : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%"\r
+       : (isNaN(x = Math.floor(x)) ? _jmol.allowedJmolSize[2]\r
+               : x < _jmol.allowedJmolSize[0] ? _jmol.allowedJmolSize[0]\r
+           : x > _jmol.allowedJmolSize[1] ? _jmol.allowedJmolSize[1] \r
+        : x) + (units ? units : ""));\r
+}\r
+\r
+\r
+\r
+\r
diff --git a/examples/linkedapplets_ng.html b/examples/linkedapplets_ng.html
new file mode 100644 (file)
index 0000000..01f867a
--- /dev/null
@@ -0,0 +1,236 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">\r
+<html><!-- InstanceBegin template="/Templates/jtemplate.dwt" codeOutsideHTMLIsLocked="false" -->\r
+<head>\r
+<!-- InstanceBeginEditable name="doctitle" -->\r
+<title>Linked Jalview Applets Demo</title>\r
+<!-- InstanceEndEditable --> \r
+<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"><meta http-equiv="keywords" content="jalview,multiple,sequence,alignment,editor,viewer,java,download,barton group,protein,dna,das,distributed annotation system">\r
+<!-- InstanceBeginEditable name="head" -->\r
+<script src="http://www.java.com/js/deployJava.js"></script>\r
+<script src="javascript/jalview.js" language="javascript"></script>\r
+<script>  //deployJava.debug="true";\r
+  \r
+  function lJvApp() {\r
+    var jvapp = document.getElementById("jvapp");\r
+    var jvfollower = document.getElementById("jvfollower");\r
+    setConsole(document.getElementById("stdout"));\r
+    //jvapp.setSeparator(""+jvapp.getSeparator());\r
+    linkJvJmol(jvapp);\r
+  };\r
+\r
+  function lJvFollow() {\r
+    var jvapp = document.getElementById("jvapp");\r
+    var jvfollower = document.getElementById("jvfollower");\r
+    //jvfollower.setSeparator(""+jvfollower.getSeparator());\r
+    linkJvJmol(jvfollower);\r
+  };\r
+</script>\r
+\r
+<!-- InstanceEndEditable --> \r
+<style type="text/css">\r
+<!--\r
+td {\r
+  font-family: Geneva, Arial, Helvetica, sans-serif;\r
+  font-size: 12px;\r
+}\r
+.plain {\r
+  font-family: Verdana, Arial, Helvetica, sans-serif;\r
+  font-size: 14px;\r
+  text-decoration: none;\r
+}\r
+.plain:hover{\r
+  background-color:#000000; color: #F2F2FF;\r
+}\r
\r
+-->\r
+</style>\r
+<script language="JavaScript">\r
+function genHref()\r
+{\r
+var s1 = "ml:ljvwr", s2 = "athpai.g", s3 = "ioe@leo ", href="";\r
+for(i=0; i<8; i++)\r
+{href = href + s1.charAt(i) + s2.charAt(i) + s3.charAt(i);  }\r
+window.location=href;\r
+}\r
+function getEventTarget(e)\r
+{\r
+if(!e)\r
+e = window.event;\r
+if(e.target)\r
+return e.target;\r
+return e.srcElement;\r
+}\r
+</script>\r
+</head>\r
+<body alink="#000000" vlink="#000000" link="#000000">\r
+<script type="text/javascript">\r
+var gaJsHost = (("https:" == document.location.protocol) ? \r
+"https://ssl." : "http://www.");\r
+document.write(unescape("%3Cscript src='" + gaJsHost + \r
+"google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));\r
+</script>\r
+<script type="text/javascript">\r
+try{\r
+var pageTracker = _gat._getTracker("UA-9060947-1");\r
+pageTracker._trackPageview();\r
+} catch(err) {}\r
+</script>\r
+<div align="left"> \r
+  <table width="805" height="100" cellpadding="5">\r
+    <tr>\r
+      <td background="../jalview.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.compbio.dundee.ac.uk" target="NEW"><img src="../uodc_r1_c1.gif" width="143" height="101" border="1"></a></td>\r
+    </tr>\r
+  </table>\r
+  <table width="805" border="0" cellpadding="5" cellspacing="5">\r
+    <tr> \r
+      <td width="183" valign="top" bgcolor="#F2F2FF" border="5"> \r
+    \r
+    <div align="center">\r
+          <table width="182" height="386" border="0" cellpadding="0" cellspacing="0">\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../index.html" class="plain">Home</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../overview.html" class="plain">Overview</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../download.html" class="plain">Download</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="applets.html" class="plain">Applet \r
+                Version</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="examples.html" class="plain">Screenshots</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../faq.html" class="plain">FAQ</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../documentList.html" class="plain">Documentation</a></td>\r
+            </tr>\r
+            <tr>\r
+              <td align="left" valign="middle" ><a href="../releaseHistory.html" class="plain">Release \r
+                history</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="../source/source.html" class="plain">Source \r
+                Code</a></td>\r
+            </tr>\r
+      <tr> \r
+              <td align="left" valign="middle"><a href="../versions.html" class="plain">Development Version</a></td>\r
+            </tr>\r
+      <tr> \r
+              <td align="left" valign="middle"><a href="../links.html" class="plain">Links</a></td>\r
+            </tr>\r
+            <tr> \r
+              <td align="left" valign="middle"><a href="http://www.jalview.org/mailman/listinfo/jalview-announce" class="plain" target="NEW">News \r
+                Mailing List</a></td>\r
+            </tr>\r
+            <tr>\r
+              <td align="left" valign="middle"><a\r
+            href="http://www.jalview.org/mailman/listinfo/jalview-discuss"\r
+            class="plain" target="NEW">Discussion Mailing List</a><br><br><em>Please send problems<br>and\r
+            bug reports to the discussion list.</em></td>\r
+            </tr>\r
+            <tr></tr>\r
+            <tr>\r
+              <!--<td align="left" valign="middle"><br>\r
+                Please send problems<br>and\r
+            bug reports to:<br><a href="#" onClick="javascript:genHref();"><img src="../help.gif" width="123" height="19" border="0"></a></td>-->\r
+            </tr>\r
+          </table>\r
+        </div>\r
+        <div align="center"> <a href="http://www.bbsrc.ac.uk/" target="NEW"><br>\r
+          <img src="../bbsrc-new.gif" width="179" height="64" border="1"></a> \r
+        </div>\r
+        </td>\r
+      <td valign="top" width="587" bgcolor="#F2F2FF"><!-- InstanceBeginEditable name="Contents" -->\r
+    <p>&nbsp;</p>\r
+    <strong>JalviewLite Linked Applets Demo<br></strong>\r
+    <p>The two applets below use <a href="JalviewLiteJs.html">JalviewLite's javascript API</a> to exchange events about the currently selected region and mouse position in the alignment.\r
+    </p>\r
+    <p>See the other demonstration pages below to see the API in action:</p>\r
+    <ul>\r
+          <li><a href="formComplete.html">use Javascript to control and get data from JalviewLite</a></li>\r
+          <li><a href="embeddedWJmol.html">configure JalviewLite to talk to a Jmol applet on the page.</a></li>\r
+          <li><a href="javascriptLaunch.html">launch JalviewLite from a javascript button</a></li>\r
+          \r
+    </ul>\r
+       <script> \r
+  var attributes = {\r
+    code : 'jalview.bin.JalviewLite',\r
+    archive : 'jalviewApplet.jar',\r
+    width : 800,\r
+    height : 300,\r
+    mayscript : 'True', scriptable: 'True',\r
+    id : 'jvapp'\r
+  };\r
+  var parameters = {\r
+    oninit : "lJvApp",\r
+    automaticScrolling : "true",\r
+    file : "plantfdx.fa",\r
+    annotations : "plantfdx.annotations",\r
+    debug : "true",\r
+    wrap : "false",\r
+    // separator : "^",\r
+    showAnnotation : "true",\r
+    embedded : "true",\r
+    showFullId : "false",\r
+    RGB : "F2F2FF",\r
+    linkLabel_1 : "SRS",\r
+    linkUrl_1 : "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[uniprot-all:$SEQUENCE_ID$]+-vn+2"\r
\r
+    ,\r
+    linkLabel_2 : "Uniprot"\r
\r
+    ,\r
+    linkUrl_2 : "http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID$",\r
+    APPLICATION_URL : "http://www.jalview.org/services/launchApp"\r
+  };\r
\r
+  deployJava.runApplet(attributes, parameters, '1.6');\r
+</script>\r
+<script> \r
+  var attributes = {\r
+    code : 'jalview.bin.JalviewLite',\r
+    archive : 'jalviewApplet.jar',\r
+    width : 800,\r
+    height : 300,\r
+    mayscript : 'True', scriptable: 'True',\r
+    id : "jvfollower"\r
+  };\r
+  var parameters = {\r
+    oninit : "lJvFollow",\r
+    file : "plantfdx.fa",\r
+    annotations : "plantfdx.annotations",\r
+    automaticScrolling : "true",\r
+    debug : "true",\r
+    wrap : "false",\r
+    // separator : "^",\r
+    showAnnotation : "true",\r
+    embedded : "true",\r
+    showFullId : "false",\r
+    RGB : "F2F2FF",\r
+    linkLabel_1 : "SRS",\r
+    linkUrl_1 : "http://srs.ebi.ac.uk/srs7bin/cgi-bin/wgetz?-e+[uniprot-all:$SEQUENCE_ID$]+-vn+2"\r
\r
+    ,\r
+    linkLabel_2 : "Uniprot"\r
\r
+    ,\r
+    linkUrl_2 : "http://us.expasy.org/cgi-bin/niceprot.pl?$SEQUENCE_ID$",\r
+    APPLICATION_URL : "http://www.jalview.org/services/launchApp"\r
+  };\r
+  deployJava.runApplet(attributes, parameters, '1.6');\r
+</script>\r
+    <p>\r
+<!--      <a href="javascript:linkJvJmol()">Click Me If you don't see any messages below</a>\r
+      <br>\r
+       --><form name="console" id="console"><textarea name="output"\r
+        id="stdout" rows="20" cols="80">Messages  will appear here.</textarea></form>\r
+      <br>\r
+</p>\r
+\r
+</body>\r
+</html>
\ No newline at end of file