From: jprocter Date: Tue, 5 Jul 2011 11:05:43 +0000 (+0100) Subject: new and restructured javascript examples and documentation (JAL-816, X-Git-Tag: Release_2_7~157 X-Git-Url: http://source.jalview.org/gitweb/?a=commitdiff_plain;h=b72f4090d5f4b06bbe6c9bace36bed652a350b82;p=jalview.git new and restructured javascript examples and documentation (JAL-816, JAL-621, JAL-856, JAL-859, JAL-862, JAL-433, JAL-469) --- diff --git a/examples/appletParameters.html b/examples/appletParameters.html index 9a26f15..b578ef5 100644 --- a/examples/appletParameters.html +++ b/examples/appletParameters.html @@ -3,7 +3,7 @@
       

Download the applet jar file from here. Parameters are described - below, and the javascript API is described here. + below, and the javascript API is described here.

Useful to know!!

    diff --git a/examples/applets.html b/examples/applets.html index eeb0d87..21ed203 100755 --- a/examples/applets.html +++ b/examples/applets.html @@ -15,7 +15,7 @@

    For more information on how to use the applet in your website, see full list of applet parameters.

    -

    Pressing one of the buttons below will load up a cut down version +

    Pressing one of the buttons below will load up JalviewLite, a cut down version of Jalview, which runs within your web browser.

    Ferredoxins, chloroplast precursor related UniRef50 cluster
    @@ -82,8 +82,8 @@

- - + @@ -132,6 +132,6 @@
- -
+ +

 

For more JalviewLite examples, follow the links below.

\ No newline at end of file diff --git a/examples/embedded.html b/examples/embedded.html index 1339cf1..3f61c17 100644 --- a/examples/embedded.html +++ b/examples/embedded.html @@ -15,7 +15,7 @@ Embedded viewing of Alignments Jalview Alignment Annotations File + width="756" height="560" archive="jalviewApplet.jar"> diff --git a/examples/embeddedWJmol.html b/examples/embeddedWJmol.html new file mode 100644 index 0000000..a8c803c --- /dev/null +++ b/examples/embeddedWJmol.html @@ -0,0 +1,242 @@ + + + + +Embedded JalviewLite talking to externally managed Jmol + + + + + + + + + + + + + + + + + + + + + +
+ + + + +
       
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Home
Overview
Download
Applet + Version
Screenshots
FAQ
Documentation
Release + history
Source + Code
Development Version
Links
News + Mailing List
Discussion Mailing List

Please send problems
and + bug reports to the discussion list.
+
+

+
+
+
+ + + + +
+
+
+
+ + + + + + + \ No newline at end of file diff --git a/examples/formComplete.html b/examples/formComplete.html index fb1d7de..5da0fbf 100644 --- a/examples/formComplete.html +++ b/examples/formComplete.html @@ -127,11 +127,11 @@ pageTracker._trackPageview();

 

+ Using the JalviewLite API to fill out forms using data from JalviewLite
Click the Javascript buttons below to interact with the Applet instance on the page.
- View the source in your browser to see how it has been done.
- The applet's public API methods are listed below - the following example.
+ View the source in your browser to see how it has been done.
+ View the full JalviewLite API documentation. @@ -175,128 +175,8 @@ pageTracker._trackPageview(); onClick="document.applets.Jalview.setFeatureGroupState(document.forms.groupForm.groups.value, false)" value="Hide groups" /> -

Since Jalview 2.5, the public methods listed - below are available to be called via Javascript.

-

Unfortunately Javascript - Java communication is not possible - using Internet Explorer or Opera on Macs. Please use Safari or - Firefox.

-

If more than one Jalview window is open, Jalview returns the - alignment in the active window, unless you provide an AlignFrame - object reference.

-

The alignment output format can be either Fasta, PFAM, Clustal, - MSF, PIR, or BLC.

-

When referring to the Jalview applet in javascript, you must - either give Jalview a name in the applet tag or use the applets index.

- -
//get list of IDs of selected sequences
-public String getSelectedSequences()
-
-// list of IDs of selected sequences terminated by sep or, if sep is null, '¬' (¬)
-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
-
-
+ + diff --git a/examples/jalviewLiteJs.html b/examples/jalviewLiteJs.html new file mode 100644 index 0000000..434d1a7 --- /dev/null +++ b/examples/jalviewLiteJs.html @@ -0,0 +1,371 @@ + + + + +JalviewLite API documentation + + + + + + + + + + +
+ + + + +
       
+ + + + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Home
Overview
Download
Applet + Version
Screenshots
FAQ
Documentation
Release + history
Source + Code
Development Version
Links
News + Mailing List
Discussion Mailing List

Please send problems
and + bug reports to the discussion list.
+
+

+
+
+
+

 

+ JalviewLite Javascript API
+

The jalviewLite applet's application programming interface (API) includes two components. A JalviewLite Javascript Library and the public methods on the JalviewLite applet. +

The best way to learn how to use the API is to see it in action on the demonstration pages below:

+ +

Notes

+
    +
  • Unfortunately Javascript - Java communication is not possible + using Internet Explorer or Opera on Macs. Please use Safari or + Firefox.
  • +
  • If more than one Jalview window is open, Jalview returns the + alignment in the active window, unless you provide an AlignFrame + object reference.
  • +
  • The alignment output format can be either Fasta, PFAM, Clustal, + MSF, PIR, or BLC.
  • +
  • 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.
  • +
  • When creating javascript functions that are called by jalviewLite (e.g. the oninit 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. +
  • +
+ +

JalviewLite's Java API

+

The following public methods on the jalviewLite applet are available to be called from javascript:

+
//get list of IDs of selected sequences
+public String getSelectedSequences()
+
+// list of IDs of selected sequences terminated by sep or, if sep is null, '¬' (¬)
+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
+
+
+
+ + diff --git a/examples/javascript/jalview.js b/examples/javascript/jalview.js new file mode 100644 index 0000000..4cc613e --- /dev/null +++ b/examples/javascript/jalview.js @@ -0,0 +1,305 @@ +// default console to report messages +var _console = document.getElementById("stdout"); +var _jvapps = new Array(); +// jvjmols is a list associating a jmol id to { modelstofiles } +var _jvjmols = new Hashtable(); +// array of model names used to lookup index in Jmol +var _modeltofiles = new Array(); +// counter for jmol structures +var mnum = 1; + +function setConsole(console) { + _console = console; +} + +function getDestinationFrms(source, frames) { + var frms = new Array(); + var frid = ""; + for (frm in frames) { + try { + frid = (("" + source.getDatasetId()) == ("" + frames[frm] + .getDatasetId())); + } catch (q) { + } + ; + if (!frames[frm].equals(source) && !frid + && !frames[frm].currentAlignFrame.equals(source)) { + frms[frms.length] = frames[frm]; + } + } + return frms; +} + +function mouseover(list1, list2, list3, list4) { + // list1 = new Object(list1); + var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4)); + var msg = "Mouse over :\n" + "AlignFrame obj: " + list1 + " Seq : " + + list[1] + "\nPos: " + list[2] + "(" + list[3] + ")\n"; + + var flist = getDestinationFrms(list1, _jvapps); + if (_console) { + _console.value = msg + "\n"; + } + + for (follower in flist) { + if (_console) { + _console.value += "Sending to " + flist[follower] + "\n"; + } + flist[follower].highlight(list[1], list[2], "true"); + } + return true; +} + +function sellist(list1, list2, list3, list4) { + // list1 = new Object(list1); + var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4)); + var msg = "Selection:\n" + "AlignFrame obj: " + list[0] + " id : " + + list[1] + "\nSeqs " + list[2] + "\nColumns " + list[3] + "\n"; + var flist = getDestinationFrms(list1, _jvapps); + if (_console) { + _console.value = msg + "\n"; + } + + for (follower in flist) { + if (_console) { + _console.value += "Sending to " + flist[follower] + "\n"; + } + flist[follower].selectIn(flist[follower].getDefaultTargetFrame(), + list[2], list[3]) + } + return true; +} + +function viewlist(list1, list2, list3, list4) { + // list1 = new Object(list1); + var list = new Array(("" + list1), ("" + list2), ("" + list3), ("" + list4)); + var msg = "Viewport extent change::\n" + "AlignFrame obj: " + list[0] + + " id : " + list[1] + "\nRow from " + list[2] + " and to " + + list[3] + "\nVisible columns: " + list[4] + "\n"; + var flist = getDestinationFrms(list1, _jvapps); + if (_console) { + _console.value = msg + "\n"; + } + + for (follower in flist) { + if (_console) { + _console.value += "Sending to " + flist[follower] + "\n"; + } + flist[follower].scrollToViewIn(flist[follower].getDefaultTargetFrame(), + list[2], "-1"); + } + return true; +} + +// register a jalview applet and add some handlers to it +// jmolView is a reference to a jmol applet that is displaying the PDB files listed (in order) in the modeltofiles Array +function linkJvJmol(applet, jmolView, modeltofiles) { + var i = _jvapps.length; + while (i--) { + if (_jvapps[i].equals(applet)) { + throw ("Ignoring additional linkJvJmol call for " + + applet.getName() + "."); + } + } + _jvapps[_jvapps.length] = applet; + applet.setMouseoverListener("mouseover"); + applet.setSelectionListener("sellist"); + // viewListener not fully implemented in 2.7 + // try { applet.setViewListener("viewlist"); } catch (err) {}; + if (jmolView) + { + var oldjm=jmolView; + // recover full id of Jmol applet + jmolView=_jmolGetApplet(jmolView).id; + var jmbinding=_jvjmols.get(jmolView); + if (!jmbinding) + { + jmbinding=new Object(); + jmbinding._modelstofiles=new Array(); + jmbinding._fullmpath=new Array(); + jmbinding._filetonum=new Hashtable(); + jmbinding._jmol=jmolView; + jmbinding._jmhandle=oldjm; + _jvjmols.put(jmolView,jmbinding); + } + + jmbinding._modelstofiles=jmbinding._modelstofiles.concat(jmbinding._modelstofiles,modeltofiles); + jmbinding._jmol=jmolView; + // now update structureListener list + mtf=""; + var dbase = document.baseURI.substring(0,document.baseURI.lastIndexOf("/")+1); + for (m in jmbinding._modelstofiles) + { mtf+=jmbinding._modelstofiles[m]; + if (jmbinding._modelstofiles[m].indexOf("//")==-1) + { jmbinding._fullmpath[m] = dbase+jmbinding._modelstofiles[m]; } + jmbinding._filetonum.put(jmbinding._modelstofiles[m], m); + jmbinding._filetonum.put(jmbinding._fullmpath[m], m); + + if (m>0) { mtf+=sep; }} + jvfollower.setStructureListener("_structure", mtf); + } +} + +/*function _addJmolModel(jmolid, modelname) { + modelname=""+modelname; + var jminf = _jvjmols[jmolid]; + if (!jminf) { + jminf = new Object(); + jminf._modelstofiles = new Array(); //new Hashtable(); + jminf._jmol = jmolid; + jminf._modellist=new Array(); + _jvjmols[jmolid] = jminf; + } + var obj = new Object(); + jminf._modeltofiles[modelname] = obj; // .put(modelname, obj); + obj.id = modelname; + obj.mnum = jminf._modeltofiles.length; + jminf._modellist+=modelname; +}*/ + + + +// jmol Jalview Methods + +function _structure(list1, list2, list3, list4) { + var follower; + // if (_console) { if (!_console.value) { _console.value="";} } + if (list1 == "mouseover") { + var list = new Array(("" + list1), ("" + list2), ("" + list3), + ("" + list4)); + // 1 is pdb file, 2 is residue number, 3 is chain + // list1 = new Object(list1); + var base = list[1].indexOf(document.baseURI + .substring(0, document.baseURI.lastIndexOf('/')) + ); // .indexOf(_path); + if (base==0) { base = document.baseURI.lastIndexOf('/'); } + var sid = list[1]; // .substring(base); + base = list[1].substring(0, base); + if (_console) { + _console.value += "Model is " + list[1] + ", Structure id is : " + + sid + "\n"; + } + ; + var siddat; + for ( var jmolappi in _jvjmols.values()) { + var jmolapp=_jvjmols.values()[jmolappi]; + var msg = ""; + if (siddat = jmolapp._filetonum.get(sid)) { + // we don't putin chain number because there isn't one ? + // skip select 0 bit + var ch = ""+list[3]; + if ((""+list[2]).trim().length==1) + { + ch+=":"+list[2]; + } + msg = "select (" + ch + " /" + siddat + ") ;"; + } + if (msg) { + if (_console) { + _console.value += "Sending '" + msg + "' to jmol." + "\n"; + } + } + jmolScriptWait(msg, "" + jmolapp._jmhandle); + // only do highlight for one jmol ? + // return 1; + } + } + if (list1 == "colourstruct") { + if (_console) { + _console.value += 'colourStruct("' + list1 + '","' + list2 + + '") [' + list4 + ']' + "\n"; + } + setTimeout('colourStruct("'+list4+'","' + list1 + '","' + list2 + '")', 1); + return 1; + } + return 1; +} +// last colour message +var _lastMsg = ""; +// indicator - if _colourStruct==0 then no colouring is going on +var _colourStruct = 0; + +function colourStruct(involves, msg, handle) { + if (_colourStruct == 0) { + _colourStruct = 1; + for (ap in _jvapps) { + var _msg = ""; + do { + if (_msg.match(/\S/)) { + _lastMsg += _msg; + } + _msg = "" + _jvapps[ap].getJsMessage(msg, handle); + } while (_msg.match(/\S/)); + } + // locate the jmol that should get the message + for (var jmol in _jvjmols.values()) + { + var jml=_jvjmols.values()[jmol]; + if (jml._filetonum.get(involves)) + { + colourStructs(jml._jmhandle); + } + } + _colourStruct = 0; + } else { + // setTimeout('colourStruct("'+msg+'","'+handle+'")',3); + } +} + +function colourStructs(jmolapp) { + dbg(0, "Colouring the structures\n"); + jmolScriptWait("set selectionhalos false;" + _lastMsg + + "; select 0; set selectionhalos true;", jmolapp); + _lastMsg = ""; +} +var _jmolhovermsg=""; +function _jmolhover(jmid, atomlabel, atomidx) { + var msg=""+jmid+" "+atomlabel+" "+atomidx; + if (_jmolhovermsg==msg) + { + return; + } + _jmolhovermsg=msg; + modeltofiles = _jvjmols.get(jmid)._modelstofiles; + // atomlabel=(""+atomlabel).match(/\[(.+)\](\d+):(.)\.(\S+)\s*\/(\d+)\..+/); + // relaxed third parameter - may be null or a model number for multi model + // views + atomlabel = ("" + atomlabel) + .match(/\[(.+)\](\d+):(.)\.(\S+)\s*(\/\d+\.|).+/); + atomidx = "" + atomidx; + if (atomlabel[5]) { + atomlabel[5] = atomlabel[5].match(/\/(.+)\./)[1]; + } else { + // default - first model + atomlabel[5] = 0; + } + // use atomlabel[5] to look up model filename so we can highlight associated positions in any jalviews + for (ap in _jvapps) { + _jvapps[ap].mouseOverStructure(atomlabel[2], atomlabel[3], + document.baseURI + .substring(0, document.baseURI.lastIndexOf('/')) + + "/" + modeltofiles[atomlabel[5]]); + msg = _jmolhovermsg; + } +} +function _jmolpick(jmid, atomlabel, atomidx) { + atomlabel = "" + atomlabel; + atomidx = "" + atomidx; + // label is atom id, atom number, and xyz coordinates in the form: + // C6 #6 -0.30683374 -1.6836332 -0.716934 + // atom index, starting with 0. + +} +function _jmolMessagecallback(jmid, statmess) { + // if (statmess.indexOf("Script Terminated")==0) + { + var thisTime = new Date(); + if (_console) { + _console.value += "Last script execution took : " + + (thisTime.valueOf() - _lastTime.valueOf()) / 1000.0 + + " seconds."; + } + _lastTime = thisTime; + + } +} diff --git a/examples/javascript/jquery-1.4.4.min.js b/examples/javascript/jquery-1.4.4.min.js new file mode 100644 index 0000000..8f3ca2e --- /dev/null +++ b/examples/javascript/jquery-1.4.4.min.js @@ -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;kd)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(;K0))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
a";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="";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="
";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="
t
";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-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=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=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-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;h0?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;p0){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;i0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p=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 in[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=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";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="";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="

";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="
";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;n0)for(var h=d;h0},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-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-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=/\s]+\/)>/g,P={option:[1, +""],legend:[1,"
","
"],thead:[1,"","
"],tr:[2,"","
"],td:[3,"","
"],col:[2,"","
"],area:[1,"",""],_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
","
"];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>");try{for(var b=0,d=this.length;b0||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;f0?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>");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]===""&&!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>/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("
").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=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-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 index 0000000..502a2e8 --- /dev/null +++ b/examples/javascript/jquery.blockUI.js @@ -0,0 +1,490 @@ +/*! + * 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 = $('
'); + if (title) $m.append('

'+title+'

'); + if (message) $m.append('

'+message+'

'); + 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: '

Please wait...

', + + 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) + ? $('') + : $(''); + var lyr2 = $(''); + + var lyr3, s; + if (opts.theme && full) { + s = ''; + } + else if (opts.theme) { + s = ''; + } + else if (full) { + s = ''; + } + else { + s = ''; + } + 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 index 0000000..fe9afe2 --- /dev/null +++ b/examples/javascript/jquery.timer.js @@ -0,0 +1,75 @@ +/* + * + * 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 index 0000000..3b93622 --- /dev/null +++ b/examples/javascript/jshashtable-2.1.js @@ -0,0 +1,16 @@ +/** + * Copyright 2010 Tim Down. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +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 + Opening JalviewLite from Javascript + + + +
+ + + + + + + + + + + + \ No newline at end of file diff --git a/examples/jmol/Jmol.js b/examples/jmol/Jmol.js new file mode 100644 index 0000000..6962276 --- /dev/null +++ b/examples/jmol/Jmol.js @@ -0,0 +1,1705 @@ +/* Jmol 12.0 script library Jmol.js 9:48 PM 1/31/2011 Bob Hanson + + checkbox heirarchy -- see http://chemapps.stolaf.edu/jmol/docs/examples-11/check.htm + + based on: + * + * Copyright (C) 2004-2005 Miguel, Jmol Development, www.jmol.org + * + * Contact: hansonr@stolaf.edu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + */ + +// for documentation see www.jmol.org/jslibrary + +try{if(typeof(_jmol)!="undefined")exit() + +// place "?NOAPPLET" on your command line to check applet control action with a textarea +// place "?JMOLJAR=xxxxx" to use a specific jar file + +// bob hanson -- jmolResize(w,h) -- resizes absolutely or by percent (w or h 0.5 means 50%) +// angel herraez -- update of jmolResize(w,h,targetSuffix) so it is not tied to first applet +// bob hanson -- jmolEvaluate -- evaluates molecular math 8:37 AM 2/23/2007 +// bob hanson -- jmolScriptMessage -- returns all "scriptStatus" messages 8:37 AM 2/23/2007 +// bob hanson -- jmolScriptEcho -- returns all "scriptEcho" messages 8:37 AM 2/23/2007 +// bob hanson -- jmolScriptWait -- 11:31 AM 5/2/2006 +// bob hanson -- remove trailing separatorHTML in radio groups -- 12:18 PM 5/6/2006 +// bob hanson -- adds support for dynamic DOM script nodes 7:04 AM 5/19/2006 +// bob hanson -- adds try/catch for wiki - multiple code passes 7:05 AM 5/19/2006 +// bob hanson -- auto-initiates to defaultdir/defaultjar -- change as desired. +// bob hanson -- adding save/restore orientation w/ and w/o delay 11:49 AM 5/25/2006 +// bob hanson -- adding AjaxJS service 11:16 AM 6/3/2006 +// bob hanson -- fix for iframes not available for finding applet +// bob hanson -- added applet fake ?NOAPPLET URL flag +// bob hanson -- added jmolSetCallback(calbackName, funcName) 3:32 PM 6/13/2006 +// used PRIOR to jmolApplet() or jmolAppletInline() +// added 4th array element in jmolRadioGroup -- title +// added and id around link, checkbox, radio, menu +// fixing AJAX loads for MSIE/Opera-Mozilla incompatibility +// -- renamed Jmol-11.js from Jmol-new.js; JmolApplet.jar from JmolAppletProto.jar +// renamed Jmol.js for Jmol 11 distribution +// -- modified jmolRestoreOrientation() to be immediate, no 1-second delay +// bob hanson -- jmolScriptWait always returns a string -- 11:23 AM 9/16/2006 +// bh -- jmolCommandInput() +// bh -- jmolSetTranslation(TF) -- forces translation even if there might be message callback issues +// bh -- minor fixes suggested by Angel +// bh -- adds jmolSetSyncId() and jmolGetSyncId() +// bh 3/2008 -- adds jmolAppendInlineScript() and jmolAppendInlineArray() +// bh 3/2008 -- fixes IE7 bug in relation to jmolLoadInlineArray() +// bh 6/2008 -- adds jmolSetAppletWindow() +// Angel H. 6/2008 -- added html " + var t = "" + if (labelHtml.toLowerCase().indexOf("
" + +"
")>=0) { + t += eospan + eospan = ""; + } + t += "" +eospan; + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); +} + +function jmolStartNewRadioGroup() { + ++_jmol.radioGroupCount; +} + +function jmolRadioGroup(arrayOfRadioButtons, separatorHtml, groupName, id, title) { + /* + + array: [radio1,radio2,radio3...] + where radioN = ["script","label",isSelected,"id","title"] + + */ + + _jmolInitCheck(); + var type = typeof arrayOfRadioButtons; + if (type != "object" || type == null || ! arrayOfRadioButtons.length) { + alert("invalid arrayOfRadioButtons"); + return; + } + separatorHtml != undefined && separatorHtml != null || (separatorHtml = "  "); + var len = arrayOfRadioButtons.length; + jmolStartNewRadioGroup(); + groupName || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1)); + var t = ""; + for (var i = 0; i < len; ++i) { + if (i == len - 1) + separatorHtml = ""; + var radio = arrayOfRadioButtons[i]; + type = typeof radio; + if (type == "object") { + 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); + } else { + t += _jmolRadio(radio, null, null, separatorHtml, groupName, (id ? id : groupName)+"_"+i, title); + } + } + t+="" + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); +} + + +function jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) { + _jmolInitCheck(); + if (_jmol.radioGroupCount == 0) + ++_jmol.radioGroupCount; + var t = _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, (id ? id : groupName + "_" + _jmol.radioCount), title ? title : 0); + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); +} + +function jmolLink(script, label, id, title) { + _jmolInitCheck(); + id != undefined && id != null || (id = "jmolLink" + _jmol.linkCount); + label != undefined && label != null || (label = script.substring(0, 32)); + ++_jmol.linkCount; + var scriptIndex = _jmolAddScript(script); + var t = "" + label + ""; + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); +} + +function jmolCommandInput(label, size, id, title) { + _jmolInitCheck(); + id != undefined && id != null || (id = "jmolCmd" + _jmol.cmdCount); + label != undefined && label != null || (label = "Execute"); + size != undefined && !isNaN(size) || (size = 60); + ++_jmol.cmdCount; + var t = ""; + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); +} + +function _jmolCommandKeyPress(e, id, target) { + var keycode = (window.event ? window.event.keyCode : e ? e.which : 0); + if (keycode == 13) { + var inputBox = document.getElementById(id) + _jmolScriptExecute(inputBox, inputBox.value, target) + } +} + +function _jmolScriptExecute(element,script,target) { + if (typeof(script) == "object") + script[0](element, script, target) + else + jmolScript(script, target) +} + +function jmolMenu(arrayOfMenuItems, size, id, title) { + _jmolInitCheck(); + id != undefined && id != null || (id = "jmolMenu" + _jmol.menuCount); + ++_jmol.menuCount; + var type = typeof arrayOfMenuItems; + if (type != null && type == "object" && arrayOfMenuItems.length) { + var len = arrayOfMenuItems.length; + if (typeof size != "number" || size == 1) + size = null; + else if (size < 0) + size = len; + var sizeText = size ? " size='" + size + "' " : ""; + var t = "" + + "
\n" + + noJavaMsg2 + + "
"; + } + params.loadInline = (inlineModel ? inlineModel : ""); + params.script = (script ? _jmolSterilizeScript(script) : ""); + var t = tHeader + _jmolParams() + visitJava + tFooter; + jmolSetTarget(nameSuffix); + ready["jmolApplet" + nameSuffix] = false; + if (_jmol.debugAlert) + alert(t); + return _jmolDocumentWrite(t); + } +} + +function _jmolParams() { + var t = ""; + for (var i in _jmol.params) + if(_jmol.params[i]!="") + t+=" \n"; + return t +} + +function _jmolInitCheck() { + if (_jmol.initChecked) + return; + _jmol.initChecked = true; + jmolInitialize(defaultdir, defaultjar) +} + +function _jmolCheckBrowser() { + with (_jmol) { + if (browserChecked) + return; + browserChecked = true; + + if (isFullyCompliant) + return true; + + if (checkBrowserAction == "redirect") + location.href = checkBrowserUrlOrMessage; + else if (checkBrowserAction == "popup") + _jmolPopup(checkBrowserUrlOrMessage); + else { + var msg = checkBrowserUrlOrMessage; + if (msg == null) + msg = "Your web browser is not fully compatible with Jmol\n\n" + + "browser: " + browser + + " version: " + browserVersion + + " os: " + os + + " isBrowserCompliant: " + isBrowserCompliant + + " isJavaCompliant: " + isJavaCompliant + + "\n\n" + ua; + alert(msg); + } + } + return false; +} + +function jmolSetXHTML(id) { + _jmol.isXHTML = true + _jmol.XhtmlElement = null + _jmol.XhtmlAppendChild = false + if (id){ + _jmol.XhtmlElement = document.getElementById(id) + _jmol.XhtmlAppendChild = true + } +} + +function _jmolDocumentWrite(text) { + if (_jmol.currentDocument) { + if (_jmol.isXHTML && !_jmol.XhtmlElement) { + var s = document.getElementsByTagName("script") + _jmol.XhtmlElement = s.item(s.length - 1) + _jmol.XhtmlAppendChild = false + } + if (_jmol.XhtmlElement) { + _jmolDomDocumentWrite(text) + } else { + _jmol.currentDocument.write(text); + } + } + return text; +} + +function _jmolDomDocumentWrite(data) { + var pt = 0 + var Ptr = [] + Ptr[0] = 0 + while (Ptr[0] < data.length) { + var child = _jmolGetDomElement(data, Ptr) + if (!child)break + if (_jmol.XhtmlAppendChild) + _jmol.XhtmlElement.appendChild(child) + else + _jmol.XhtmlElement.parentNode.insertBefore(child, _jmol.XhtmlElement); + } +} +function _jmolGetDomElement(data, Ptr, closetag, lvel) { + var e = document.createElement("span") + e.innerHTML = data + Ptr[0] = data.length + return e + +//unnecessary? + + closetag || (closetag = "") + lvel || (lvel = 0) + var pt0 = Ptr[0] + var pt = pt0 + while (pt < data.length && data.charAt(pt) != "<") pt++ + if (pt != pt0) { + var text = data.substring(pt0, pt) + Ptr[0] = pt + return document.createTextNode(text) + } + pt0 = ++pt + var ch + while (pt < data.length && "\n\r\t >".indexOf(ch = data.charAt(pt)) < 0) pt++ + var tagname = data.substring(pt0, pt) + var e = (tagname == closetag || tagname == "/" ? "" + : document.createElementNS ? document.createElementNS('http://www.w3.org/1999/xhtml', tagname) + : document.createElement(tagname)); + if (ch == ">") { + Ptr[0] = ++pt + return e + } + while (pt < data.length && (ch = data.charAt(pt)) != ">") { + while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++ + pt0 = pt + while (pt < data.length && "\n\r\t =/>".indexOf(ch = data.charAt(pt)) < 0) pt++ + var attrname = data.substring(pt0, pt).toLowerCase() + if (attrname && ch != "=") + e.setAttribute(attrname, "true") + while (pt < data.length && "\n\r\t ".indexOf(ch = data.charAt(pt)) >= 0) pt++ + if (ch == "/") { + Ptr[0] = pt + 2 + return e + } else if (ch == "=") { + var quote = data.charAt(++pt) + pt0 = ++pt + while (pt < data.length && (ch = data.charAt(pt)) != quote) pt++ + var attrvalue = data.substring(pt0, pt) + e.setAttribute(attrname, attrvalue) + pt++ + } + } + Ptr[0] = ++pt + while (Ptr[0] < data.length) { + var child = _jmolGetDomElement(data, Ptr, "/" + tagname, lvel+1) + if (!child)break + e.appendChild(child) + } + return e +} + +function _jmolPopup(url) { + var popup = window.open(url, "JmolPopup", + "left=150,top=150,height=400,width=600," + + "directories=yes,location=yes,menubar=yes," + + "toolbar=yes," + + "resizable=yes,scrollbars=yes,status=yes"); + if (popup.focus) + poup.focus(); +} + +function _jmolReadyCallback(name) { + if (_jmol.debugAlert) + alert(name + " is ready"); + _jmol.ready["" + name] = true; +} + +function _jmolSterilizeScript(script) { + script = script.replace(/'/g, "'"); + if (_jmol.debugAlert) + alert("script:\n" + script); + return script; +} + +function _jmolSterilizeInline(model) { + model = model.replace(/\r|\n|\r\n/g, (model.indexOf("|") >= 0 ? "\\/n" : "|")).replace(/'/g, "'"); + if (_jmol.debugAlert) + alert("inline model:\n" + model); + return model; +} + +function _jmolRadio(script, labelHtml, isChecked, separatorHtml, groupName, id, title) { + ++_jmol.radioCount; + groupName != undefined && groupName != null || (groupName = "jmolRadioGroup" + (_jmol.radioGroupCount - 1)); + if (!script) + return ""; + labelHtml != undefined && labelHtml != null || (labelHtml = script.substring(0, 32)); + separatorHtml || (separatorHtml = "") + var scriptIndex = _jmolAddScript(script); + var eospan = "
" + var t = "" + if (labelHtml.toLowerCase().indexOf("
")>=0) { + t += eospan + eospan = ""; + } + t += "" +eospan + separatorHtml; + + return t; +} + +function _jmolFindApplet(target) { + // first look for the target in the current window + var applet = _jmolFindAppletInWindow(_jmol.appletWindow != null ? _jmol.appletWindow : window, target); + // THEN look for the target in child frames + if (applet == undefined) + applet = _jmolSearchFrames(window, target); + // FINALLY look for the target in sibling frames + if (applet == undefined) + applet = _jmolSearchFrames(top, target); // look starting in top frame + return applet; +} + +function _jmolGetApplet(targetSuffix){ + var target = "jmolApplet" + (targetSuffix ? targetSuffix : "0"); + var applet = _jmolFindApplet(target); + if (applet) return applet + _jmol.alerted || alert("could not find applet " + target); + _jmol.alerted = true; + return null +} + +function _jmolSearchFrames(win, target) { + var applet; + var frames = win.frames; + if (frames && frames.length) { // look in all the frames below this window + try{ + for (var i = 0; i < frames.length; ++i) { + applet = _jmolSearchFrames(frames[i], target); + if (applet) + return applet; + } + }catch(e) { + if (_jmol.debugAlert) + alert("Jmol.js _jmolSearchFrames cannot access " + win.name + ".frame[" + i + "] consider using jmolSetAppletWindow()") + } + } + return applet = _jmolFindAppletInWindow(win, target) +} + +function _jmolFindAppletInWindow(win, target) { + var doc = win.document; + if (doc.getElementById(target)) + return doc.getElementById(target); + else if (doc.applets) + return doc.applets[target]; + else + return doc[target]; +} + +function _jmolAddScript(script) { + if (!script) + return 0; + var index = _jmol.scripts.length; + _jmol.scripts[index] = script; + return index; +} + +function _jmolClick(elementClicked, scriptIndex, targetSuffix) { + _jmol.element = elementClicked; + _jmolScriptExecute(elementClicked, _jmol.scripts[scriptIndex], targetSuffix); +} + +function _jmolMenuSelected(menuObject, targetSuffix) { + var scriptIndex = menuObject.value; + if (scriptIndex != undefined) { + _jmolScriptExecute(menuObject, _jmol.scripts[scriptIndex], targetSuffix); + return; + } + var len = menuObject.length; + if (typeof len == "number") { + for (var i = 0; i < len; ++i) { + if (menuObject[i].selected) { + _jmolClick(menuObject[i], menuObject[i].value, targetSuffix); + return; + } + } + } + alert("?Que? menu selected bug #8734"); +} + + +_jmol.checkboxMasters = {}; +_jmol.checkboxItems = {}; + +function jmolSetCheckboxGroup(chkMaster,chkBox) { + var id = chkMaster; + if(typeof(id)=="number")id = "jmolCheckbox" + id; + chkMaster = document.getElementById(id); + if (!chkMaster)alert("jmolSetCheckboxGroup: master checkbox not found: " + id); + var m = _jmol.checkboxMasters[id] = {}; + m.chkMaster = chkMaster; + m.chkGroup = {}; + for (var i = 1; i < arguments.length; i++){ + var id = arguments[i]; + if(typeof(id)=="number")id = "jmolCheckbox" + id; + checkboxItem = document.getElementById(id); + if (!checkboxItem)alert("jmolSetCheckboxGroup: group checkbox not found: " + id); + m.chkGroup[id] = checkboxItem; + _jmol.checkboxItems[id] = m; + } +} + +function _jmolNotifyMaster(m){ + //called when a group item is checked + var allOn = true; + var allOff = true; + for (var chkBox in m.chkGroup){ + if(m.chkGroup[chkBox].checked) + allOff = false; + else + allOn = false; + } + if (allOn)m.chkMaster.checked = true; + if (allOff)m.chkMaster.checked = false; + if ((allOn || allOff) && _jmol.checkboxItems[m.chkMaster.id]) + _jmolNotifyMaster(_jmol.checkboxItems[m.chkMaster.id]) +} + +function _jmolNotifyGroup(m, isOn){ + //called when a master item is checked + for (var chkBox in m.chkGroup){ + var item = m.chkGroup[chkBox] + item.checked = isOn; + if (_jmol.checkboxMasters[item.id]) + _jmolNotifyGroup(_jmol.checkboxMasters[item.id], isOn) + } +} + +function _jmolCbClick(ckbox, whenChecked, whenUnchecked, targetSuffix) { + _jmol.control = ckbox + _jmolClick(ckbox, ckbox.checked ? whenChecked : whenUnchecked, targetSuffix); + if(_jmol.checkboxMasters[ckbox.id]) + _jmolNotifyGroup(_jmol.checkboxMasters[ckbox.id], ckbox.checked) + if(_jmol.checkboxItems[ckbox.id]) + _jmolNotifyMaster(_jmol.checkboxItems[ckbox.id]) +} + +function _jmolCbOver(ckbox, whenChecked, whenUnchecked) { + window.status = _jmol.scripts[ckbox.checked ? whenUnchecked : whenChecked]; +} + +function _jmolMouseOver(scriptIndex) { + window.status = _jmol.scripts[scriptIndex]; +} + +function _jmolMouseOut() { + window.status = " "; + return true; +} + +function _jmolSetCodebase(codebase) { + _jmol.codebase = codebase ? codebase : "."; + if (_jmol.debugAlert) + alert("jmolCodebase=" + _jmol.codebase); +} + +function _jmolOnloadResetForms() { + // must be evaluated ONLY once + _jmol.previousOnloadHandler = window.onload; + window.onload = + function() { + with (_jmol) { + if (buttonCount+checkboxCount+menuCount+radioCount+radioGroupCount > 0) { + var forms = document.forms; + for (var i = forms.length; --i >= 0; ) + forms[i].reset(); + } + if (previousOnloadHandler) + previousOnloadHandler(); + } + } +} + +//////////////////////////////////// +/////extensions for getProperty///// +//////////////////////////////////// + + +function _jmolEvalJSON(s,key){ + s=s+"" + if(!s)return [] + if(s.charAt(0)!="{"){ + if(s.indexOf(" | ")>=0)s=s.replace(/\ \|\ /g, "\n") + return s + } + var A = eval("("+s+")") + if(!A)return + if(key && A[key])A=A[key] + return A +} + +function _jmolEnumerateObject(A,key){ + var sout="" + if(typeof(A) == "string" && A!="null"){ + sout+="\n"+key+"=\""+A+"\"" + }else if(!isNaN(A)||A==null){ + sout+="\n"+key+"="+(A+""==""?"null":A) + }else if(A.length){ + sout+=key+"=[]" + for(var i=0;ib[0]?-1:0) +} + +function _jmolSortMessages(A){ + if(!A || typeof(A)!="object")return [] + var B = [] + for(var i=A.length-1;i>=0;i--)for(var j=0;j=0;) + for(var j=0;j< Ret[i].length;j++) + s+=Ret[i][j]+"\n" + return s +} + +function jmolScriptWaitOutput(script, targetSuffix) { + targetSuffix == undefined && (targetSuffix="0") + var ret = "" + try{ + if (script) { + _jmolCheckBrowser(); + var applet=_jmolGetApplet(targetSuffix); + if (applet) ret += applet.scriptWaitOutput(script); + } + }catch(e){ + } + return ret; +} + +function jmolEvaluate(molecularMath, targetSuffix) { + + //carries out molecular math on a model + + targetSuffix == undefined && (targetSuffix="0") + var result = "" + jmolGetPropertyAsJavaObject("evaluate", molecularMath, targetSuffix); + var s = result.replace(/\-*\d+/,"") + if (s == "" && !isNaN(parseInt(result)))return parseInt(result); + var s = result.replace(/\-*\d*\.\d*/,"") + if (s == "" && !isNaN(parseFloat(result)))return parseFloat(result); + return result; +} + +function jmolScriptEcho(script, targetSuffix) { + // returns a newline-separated list of all echos from a script + targetSuffix == undefined && (targetSuffix="0") + var Ret=jmolScriptWaitAsArray(script, targetSuffix) + var s = "" + for(var i=Ret.length;--i>=0;) + for(var j=Ret[i].length;--j>=0;) + if (Ret[i][j][1] == "scriptEcho")s+=Ret[i][j][3]+"\n" + return s.replace(/ \| /g, "\n") +} + + +function jmolScriptMessage(script, targetSuffix) { + // returns a newline-separated list of all messages from a script, ending with "script completed\n" + targetSuffix == undefined && (targetSuffix="0") + var Ret=jmolScriptWaitAsArray(script, targetSuffix) + var s = "" + for(var i=Ret.length;--i>=0;) + for(var j=Ret[i].length;--j>=0;) + if (Ret[i][j][1] == "scriptStatus")s+=Ret[i][j][3]+"\n" + return s.replace(/ \| /g, "\n") +} + + +function jmolScriptWaitAsArray(script, targetSuffix) { + var ret = "" + try{ + jmolGetStatus("scriptEcho,scriptMessage,scriptStatus,scriptError",targetSuffix) + if (script) { + _jmolCheckBrowser(); + var applet=_jmolGetApplet(targetSuffix); + if (applet) ret += applet.scriptWait(script); + ret = _jmolEvalJSON(ret,"jmolStatus") + if(typeof ret == "object") + return ret + } + }catch(e){ + } + return [[ret]] +} + + + +//////////// save/restore orientation ///////////// + +function jmolSaveOrientation(id, targetSuffix) { + targetSuffix == undefined && (targetSuffix="0") + return _jmol["savedOrientation"+id] = jmolGetPropertyAsArray("orientationInfo","info",targetSuffix).moveTo +} + +function jmolRestoreOrientation(id, targetSuffix) { + targetSuffix == undefined && (targetSuffix="0") + var s=_jmol["savedOrientation"+id] + if (!s || s == "")return + s=s.replace(/1\.0/,"0") + return jmolScriptWait(s,targetSuffix) +} + +function jmolRestoreOrientationDelayed(id, delay, targetSuffix) { + arguments.length < 2 && (delay=1) + targetSuffix == undefined && (targetSuffix="0") + var s=_jmol["savedOrientation"+id] + if (!s || s == "")return + s=s.replace(/1\.0/,delay) + return jmolScriptWait(s,targetSuffix) +} + +//////////// add parameter ///////////// +/* + * for adding callbacks or other parameters. Use: + + jmolSetDocument(0) + var s= jmolApplet(....) + s = jmolAppletAddParam(s,"messageCallback", "myFunctionName") + document.write(s) + jmolSetDocument(document) // if you want to then write buttons and such normally + + */ + +function jmolAppletAddParam(appletCode,name,value){ + return (value == "" ? appletCode : appletCode.replace(/\\n
" + +"Applet would be here" + +"

" + +"

" + return _jmolDocumentWrite(s) + } + + _jmolFindApplet = function(){return jmolApplet0} + + jmolApplet0 = { + script: function(script){document.getElementById("fakeApplet").value="\njmolScript:\n"+script} + ,scriptWait: function(script){document.getElementById("fakeApplet").value="\njmolScriptWait:\n"+script} + ,loadInline: function(data,script){document.getElementById("fakeApplet").value="\njmolLoadInline data:\n"+data+"\n\nscript:\n"+script} + } +} + + +/////////////////////////////////////////// + + // This should no longer be needed, jmolResizeApplet() is better; kept for backwards compatibility + /* + Resizes absolutely (pixels) or by percent of window (w or h 0.5 means 50%). + targetSuffix is optional and defaults to zero (first applet in page). + Both w and h are optional, but needed if you want to use targetSuffix. + h defaults to w + w defaults to 100% of window + If either w or h is between 0 and 1, then it is taken as percent/100. + If either w or h is greater than 1, then it is taken as a size (pixels). + */ +function jmolResize(w,h,targetSuffix) { + _jmol.alerted = true; + var percentW = (!w ? 100 : w <= 1 && w > 0 ? w * 100 : 0); + var percentH = (!h ? percentW : h <= 1 && h > 0 ? h * 100 : 0); + if (_jmol.browser=="msie") { + var width=document.body.clientWidth; + var height=document.body.clientHeight; + } else { + var netscapeScrollWidth=15; + var width=window.innerWidth - netscapeScrollWidth; + var height=window.innerHeight-netscapeScrollWidth; + } + var applet = _jmolGetApplet(targetSuffix); + if(!applet)return; + applet.style.width = (percentW ? width * percentW/100 : w)+"px"; + applet.style.height = (percentH ? height * percentH/100 : (h ? h : w))+"px"; + //title=width + " " + height + " " + (new Date()); +} + +// 13 Jun 09 -- makes jmolResize() obsolete (kept for backwards compatibility) +function jmolResizeApplet(size,targetSuffix) { + // See _jmolGetAppletSize() for the formats accepted as size [same used by jmolApplet()] + // Special case: an empty value for width or height is accepted, meaning no change in that dimension. + _jmol.alerted = true; + var applet = _jmolGetApplet(targetSuffix); + if(!applet)return; + var sz = _jmolGetAppletSize(size, "px"); + sz[0] && (applet.style.width = sz[0]); + sz[1] && (applet.style.height = sz[1]); +} + +function _jmolGetAppletSize(size, units) { + /* Accepts single number or 2-value array, each one can be one of: + percent (text string ending %), decimal 0 to 1 (percent/100), number, or text string (interpreted as nr.) + [width, height] array of strings is returned, with units added if specified. + Percent is relative to container div or element (which should have explicitly set size). + */ + var width, height; + if ( (typeof size) == "object" && size != null ) { + width = size[0]; height = size[1]; + } else { + width = height = size; + } + return [_jmolFixDim(width, units), _jmolFixDim(height, units)]; +} + +function _jmolFixDim(x, units) { + var sx = "" + x; + return (sx.length == 0 ? (units ? "" : _jmol.allowedJmolSize[2]) + : sx.indexOf("%") == sx.length-1 ? sx + : (x = parseFloat(x)) <= 1 && x > 0 ? x * 100 + "%" + : (isNaN(x = Math.floor(x)) ? _jmol.allowedJmolSize[2] + : x < _jmol.allowedJmolSize[0] ? _jmol.allowedJmolSize[0] + : x > _jmol.allowedJmolSize[1] ? _jmol.allowedJmolSize[1] + : x) + (units ? units : "")); +} + + + + diff --git a/examples/linkedapplets_ng.html b/examples/linkedapplets_ng.html new file mode 100644 index 0000000..01f867a --- /dev/null +++ b/examples/linkedapplets_ng.html @@ -0,0 +1,236 @@ + + + + +Linked Jalview Applets Demo + + + + + + + + + + + + + + +
+ + + + +
       
+ + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Home
Overview
Download
Applet + Version
Screenshots
FAQ
Documentation
Release + history
Source + Code
Development Version
Links
News + Mailing List
Discussion Mailing List

Please send problems
and + bug reports to the discussion list.
+
+

+
+
+
+

 

+ JalviewLite Linked Applets Demo
+

The two applets below use JalviewLite's javascript API to exchange events about the currently selected region and mouse position in the alignment. +

+

See the other demonstration pages below to see the API in action:

+ + + +

+

+
+

+ + + \ No newline at end of file