hgbook

changeset 917:93154fbaae9b

Merge with http://bitbucket.org/dukebody/hgbook-alqua/
author Bryan O'Sullivan <bos@serpentine.com>
date Tue Oct 27 21:31:06 2009 -0700 (2009-10-27)
parents 0aeeeab529d6 0aaa70be1b13
children 07676b6f6545 a05a5ae66c38 0525fc68b7fe
files web/icons/caution.png web/icons/favicon.png web/icons/important.png web/icons/note.png web/icons/remark.png web/icons/rss.png web/icons/shell.png web/icons/source.png web/icons/tip.png web/icons/warning.png web/javascript/form-min.js web/javascript/form.js web/javascript/jquery-min.js web/javascript/jquery.js web/styles.css
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/plastex-theme/README.txt	Tue Oct 27 21:31:06 2009 -0700
     1.3 @@ -0,0 +1,12 @@
     1.4 +This is a theme designed to use with the plasTeX page template
     1.5 +renderer to generate commentable documents.
     1.6 +
     1.7 +To "install" it, symlink this folder from the plasTeX XHTML Themes
     1.8 +folder. Example:
     1.9 +
    1.10 +faraday:/usr/lib/pymodules/python2.5/plasTeX/Renderers/XHTML/Themes#
    1.11 +ln -s (this folder) alqua
    1.12 +
    1.13 +Usage example:
    1.14 +
    1.15 +$ plastex --theme=alqua --split-level=0 mylatex.tex
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/plastex-theme/default-layout.html	Tue Oct 27 21:31:06 2009 -0700
     2.3 @@ -0,0 +1,145 @@
     2.4 +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     2.5 +<html tal:define="links self/links" 
     2.6 +      xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
     2.7 +  <head>
     2.8 +
     2.9 +    <meta name="generator" content="plasTeX" />
    2.10 +    <meta http-equiv="content-type"
    2.11 +          tal:attributes="content string:text/html;; charset=${config/files/output-encoding}" />
    2.12 +
    2.13 +    <title tal:condition="python:path('self/level') &gt; -10"
    2.14 +           tal:content="stripped string:${links/document/title}: ${self/title}">
    2.15 +      Book title
    2.16 +    </title>
    2.17 +    <link tal:condition="links/next" 
    2.18 +          rel="next" 
    2.19 +          tal:attributes="href links/next/url; title links/next/title/textContent" />
    2.20 +    <link tal:condition="links/prev" 
    2.21 +          rel="prev" 
    2.22 +          tal:attributes="href links/prev/url; title links/prev/title/textContent" />
    2.23 +    <link tal:condition="links/up" 
    2.24 +          rel="up" 
    2.25 +          tal:attributes="href links/up/url; title links/up/title/textContent" />
    2.26 +
    2.27 +    <link rel="stylesheet" href="styles/styles.css"/>
    2.28 +    <link rel="stylesheet" href="/support/styles/styles.css"/>
    2.29 +
    2.30 +    <link rel="alternate" type="application/atom+xml" title="Comments"
    2.31 +          href="/feeds/comments/"/>
    2.32 +    <link rel="shortcut icon" type="image/png"
    2.33 +          href="/support/figs/favicon.png"/>
    2.34 +
    2.35 +    <script type="text/javascript" src="/support/javascript/jquery.js"></script>
    2.36 +    <script type="text/javascript" src="/support/javascript/form-min.js"></script>
    2.37 +
    2.38 +  </head>
    2.39 +
    2.40 +  <body>
    2.41 +
    2.42 +    <div class="navheader"><h2 class="booktitle">
    2.43 +        <tal:booktitle replace="links/document/title" />
    2.44 +        <div class="authors">by 
    2.45 +          <tal:author tal:content="links/document/attributes/author">
    2.46 +            Author
    2.47 +          </tal:author>
    2.48 +        </div>
    2.49 +      </h2>
    2.50 +    </div>
    2.51 +
    2.52 +    <div class="navheader" metal:define-macro="navigation">
    2.53 +      <table width="100%">
    2.54 +        <tr>
    2.55 +          <td width="40%" align="left">
    2.56 +            <a tal:condition="links/prev"
    2.57 +               tal:attributes="href links/prev/url;
    2.58 +                               title stripped:links/prev/title"
    2.59 +               accesskey="p">Prev</a> </td>
    2.60 +          <td width="20%" align="center"> 
    2.61 +            <a tal:condition="links/up"
    2.62 +               tal:attributes="href links/up/url">Up</a>
    2.63 +          </td>
    2.64 +          <td width="40%" align="right"> 
    2.65 +            <a tal:condition="links/next"
    2.66 +               tal:attributes="href links/next/url;
    2.67 +                               title stripped:links/next/title"
    2.68 +               accesskey="n">Next</a>
    2.69 +          </td>
    2.70 +        </tr>
    2.71 +        <tr>
    2.72 +          <td width="40%" align="left">
    2.73 +            <span tal:condition="links/prev"
    2.74 +               tal:replace="stripped:links/prev/title">Prev</span>
    2.75 +          </td>
    2.76 +          <td width="20%" align="center"> </td>
    2.77 +          <td width="40%" align="right"> 
    2.78 +            <span tal:condition="links/next"
    2.79 +               tal:replace="stripped:links/next/title">Next</span>
    2.80 +          </td>
    2.81 +        </tr>
    2.82 +      </table>
    2.83 +    </div>
    2.84 +
    2.85 +    <div class="chapter" 
    2.86 +         tal:attributes="id string:${links/document/title}: ${self/title}">
    2.87 +      
    2.88 +      <div class="file_contents" tal:content="self">File contents.</div>
    2.89 +      
    2.90 +      <div tal:condition="self/tableofcontents" 
    2.91 +           tal:attributes="class
    2.92 +                           string:contents
    2.93 +                           ${self/nodeName}-contents">
    2.94 +        <ul>
    2.95 +          <li tal:repeat="section self/tableofcontents"><a href="." tal:attributes="href section/url" tal:content="section/fullTocEntry">Aliquam est. Aliquam fringilla pede</a>
    2.96 +            <ul tal:condition="section/tableofcontents">
    2.97 +              <li tal:repeat="subsection section/tableofcontents"><a href="." tal:attributes="href subsection/url" tal:content="subsection/fullTocEntry"></a>
    2.98 +                <ul tal:condition="subsection/tableofcontents">
    2.99 +                  <li tal:repeat="subsubsection subsection/tableofcontents"><a href="." tal:attributes="href subsubsection/url" tal:content="subsubsection/fullTocEntry"></a>
   2.100 +                    <ul tal:condition="subsubsection/tableofcontents">
   2.101 +                      <li tal:repeat="paragraph subsubsection/tableofcontents"><a href="." tal:attributes="href paragraph/url" tal:content="paragraph/fullTocEntry"></a>
   2.102 +                        <ul tal:condition="paragraph/tableofcontents">
   2.103 +                          <li tal:repeat="subparagraph paragraph/tableofcontents"><a href="." tal:attributes="href subparagraph/url" tal:content="subparagraph/fullTocEntry"></a></li>
   2.104 +                        </ul>
   2.105 +                      </li>
   2.106 +                    </ul>
   2.107 +                  </li>
   2.108 +                </ul>
   2.109 +              </li>
   2.110 +            </ul>
   2.111 +          </li>
   2.112 +          <li tal:replace="nothing"><a href=".">Maecenas id purus</a></li>
   2.113 +        </ul>
   2.114 +      </div>
   2.115 +
   2.116 +
   2.117 +      <div id="footnotes" tal:condition="self/footnotes">
   2.118 +        <p><b>Footnotes</b></p>
   2.119 +        <ol>
   2.120 +          <li tal:repeat="footnote self/footnotes" 
   2.121 +              tal:content="footnote" 
   2.122 +              tal:attributes="id footnote/id">footnote text</li>
   2.123 +        </ol>
   2.124 +      </div>
   2.125 +
   2.126 +    </div>
   2.127 +
   2.128 +    <div class="navfooter"
   2.129 +	 metal:use-macro="template/macros/navigation" />
   2.130 +
   2.131 +    <div class="hgbookfooter"> <p><img src="/support/icons/rss.png"> Want to stay
   2.132 +	up to date? Subscribe to the comment feed for the 
   2.133 +        <a class="feed"
   2.134 +	   href="/feeds/comments/">entire book</a>.</p> 
   2.135 +      <p>Icons by
   2.136 +	<a href="mailto:mattahan@gmail.com">Paul Davey</a> aka 
   2.137 +        <a href="http://mattahan.deviantart.com/">Mattahan</a>.</p>
   2.138 +      </div>
   2.139 +
   2.140 +  </body>
   2.141 +
   2.142 +  <script language="javascript" src="icons/imgadjust.js"
   2.143 +	  type="text/javascript">
   2.144 +  </script>
   2.145 +  <script type="text/javascript" src="/support/javascript/hsbook.js">
   2.146 +  </script>
   2.147 +
   2.148 +</html>
     3.1 --- a/web/hgbook/__init__.py	Tue Oct 27 21:29:13 2009 -0700
     3.2 +++ b/web/hgbook/__init__.py	Tue Oct 27 21:31:06 2009 -0700
     3.3 @@ -0,0 +1,1 @@
     3.4 +import admin
     4.1 --- a/web/hgbook/admin.py	Tue Oct 27 21:29:13 2009 -0700
     4.2 +++ b/web/hgbook/admin.py	Tue Oct 27 21:31:06 2009 -0700
     4.3 @@ -8,12 +8,13 @@
     4.4      date_hierarchy = 'date'
     4.5      list_filter = ['date', 'submitter_name']
     4.6      search_fields = ['title', 'submitter_name', 'submitter_url']
     4.7 -    fields = (
     4.8 +    fieldsets = (
     4.9          (None, {'fields': ('submitter_name', 'element', 'comment')}),
    4.10 -        ('Review and presentation state',
    4.11 -         {'fields': ('reviewed', 'hidden')}),
    4.12 -        ('Other info', {'fields': ('date', 'submitter_url', 'ip')}),
    4.13 +        ('Review and presentation state', {'fields': ('reviewed', 'hidden')}),
    4.14 +        ('Other info', {'fields': ('submitter_url', 'ip')}),
    4.15          )
    4.16 +    # XXX: adding 'date' to the 'Other info' fieldset results in a
    4.17 +    # ImproperlyConfigured error. :S
    4.18  
    4.19  class ElementAdmin(admin.ModelAdmin):
    4.20      search_fields = ['id', 'chapter']
     5.1 --- a/web/hgbook/comments/models.py	Tue Oct 27 21:29:13 2009 -0700
     5.2 +++ b/web/hgbook/comments/models.py	Tue Oct 27 21:31:06 2009 -0700
     5.3 @@ -6,7 +6,7 @@
     5.4  class Element(models.Model):
     5.5      id = models.CharField('ID attribute', max_length=64, editable=False,
     5.6                            primary_key=True)
     5.7 -    chapter = models.CharField('Chapter ID', max_length=64, editable=False,
     5.8 +    chapter = models.CharField('Chapter ID', max_length=100, editable=False,
     5.9                                 db_index=True)
    5.10      title = models.CharField('Section title', max_length=256, editable=False)
    5.11  
     6.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.2 +++ b/web/hgbook/converter.py	Tue Oct 27 21:31:06 2009 -0700
     6.3 @@ -0,0 +1,52 @@
     6.4 +from lxml import etree
     6.5 +from lxml import html
     6.6 +from lxml.cssselect import CSSSelector
     6.7 +import md5
     6.8 +import sys
     6.9 +
    6.10 +
    6.11 +args = sys.argv[1:]
    6.12 +
    6.13 +# django stuff
    6.14 +from django.core.management import setup_environ
    6.15 +import settings # Assumed to be in the same directory.
    6.16 +setup_environ(settings)       # ugly django collateral effects :(
    6.17 +from comments.models import Element
    6.18 +
    6.19 +doc_id = 'MMSC'
    6.20 +sel = CSSSelector('div.chapter p, pre, h1, table.equation')
    6.21 +chapter_sel = CSSSelector('div.chapter')
    6.22 +
    6.23 +try:
    6.24 +    filename = args[0]
    6.25 +except IndexError:
    6.26 +    raise IndexError("Usage: %s <path-to-html-file>" % __file__)
    6.27 +
    6.28 +tree = etree.parse(filename, html.HTMLParser(remove_blank_text=True))
    6.29 +root = tree.getroot()
    6.30 +
    6.31 +chapter = chapter_sel(root)[0]
    6.32 +chapter_title = chapter.get('id').split(':')[1]
    6.33 +chapter_hash = md5.new(chapter.get('id').encode('utf8')).hexdigest()
    6.34 +
    6.35 +chapter.set('id', chapter_hash)
    6.36 +
    6.37 +for element in sel(root):
    6.38 +    hsh_source = element.text or element.get('alt') or etree.tostring(element)
    6.39 +
    6.40 +    if hsh_source:
    6.41 +        hsh_source_encoded = hsh_source.encode('utf8')
    6.42 +        hsh = md5.new(hsh_source_encoded).hexdigest()
    6.43 +        element.set('id', '%s-%s' % (chapter_hash, hsh))
    6.44 +    
    6.45 +        # create the commentable element in the DB
    6.46 +        e = Element()
    6.47 +        e.id = '%s-%s' % (chapter_hash, hsh)
    6.48 +        e.chapter = chapter_hash
    6.49 +        e.title = chapter_title
    6.50 +        e.save()
    6.51 +
    6.52 +
    6.53 +
    6.54 +print etree.tostring(root)      # pipe to a file if you wish
    6.55 +
     7.1 --- a/web/hgbook/urls.py	Tue Oct 27 21:29:13 2009 -0700
     7.2 +++ b/web/hgbook/urls.py	Tue Oct 27 21:31:06 2009 -0700
     7.3 @@ -1,4 +1,4 @@
     7.4 -import os
     7.5 +import os, sys
     7.6  from django.conf.urls.defaults import *
     7.7  import hgbook.comments.feeds as feeds
     7.8  from django.contrib import admin
     7.9 @@ -16,9 +16,12 @@
    7.10       {'feed_dict': feeds}),          
    7.11  
    7.12      # Only uncomment this for local testing without Apache.
    7.13 -    # (r'^html/(?P<path>.*)$', 'django.views.static.serve',
    7.14 -    # {'document_root': os.path.realpath(os.path.dirname(
    7.15 -    #    sys.modules[__name__].__file__) + '/../../en/html'),
    7.16 +     (r'^html/(?P<path>.*)$', 'django.views.static.serve',
    7.17 +     {'document_root': os.path.realpath(os.path.dirname(
    7.18 +        sys.modules[__name__].__file__) + '/../html')}),
    7.19 +     (r'^support/(?P<path>.*)$', 'django.views.static.serve',
    7.20 +     {'document_root': os.path.realpath(os.path.dirname(
    7.21 +        sys.modules[__name__].__file__) + '/../support')}),
    7.22  
    7.23      # Uncomment this for admin:
    7.24      (r'^admin/(.*)', admin.site.root),
     8.1 Binary file web/icons/caution.png has changed
     9.1 Binary file web/icons/favicon.png has changed
    10.1 Binary file web/icons/important.png has changed
    11.1 Binary file web/icons/note.png has changed
    12.1 Binary file web/icons/remark.png has changed
    13.1 Binary file web/icons/rss.png has changed
    14.1 Binary file web/icons/shell.png has changed
    15.1 Binary file web/icons/source.png has changed
    16.1 Binary file web/icons/tip.png has changed
    17.1 Binary file web/icons/warning.png has changed
    18.1 --- a/web/javascript/form-min.js	Tue Oct 27 21:29:13 2009 -0700
    18.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    18.3 @@ -1,1 +0,0 @@
    18.4 -(function($){$.fn.ajaxSubmit=function(_2){if(typeof _2=="function"){_2={success:_2};}_2=$.extend({url:this.attr("action")||window.location,type:this.attr("method")||"GET"},_2||{});var _3={};$.event.trigger("form.pre.serialize",[this,_2,_3]);if(_3.veto){return this;}var a=this.formToArray(_2.semantic);if(_2.data){for(var n in _2.data){a.push({name:n,value:_2.data[n]});}}if(_2.beforeSubmit&&_2.beforeSubmit(a,this,_2)===false){return this;}$.event.trigger("form.submit.validate",[a,this,_2,_3]);if(_3.veto){return this;}var q=$.param(a);if(_2.type.toUpperCase()=="GET"){_2.url+=(_2.url.indexOf("?")>=0?"&":"?")+q;_2.data=null;}else{_2.data=q;}var _7=this,callbacks=[];if(_2.resetForm){callbacks.push(function(){_7.resetForm();});}if(_2.clearForm){callbacks.push(function(){_7.clearForm();});}if(!_2.dataType&&_2.target){var _8=_2.success||function(){};callbacks.push(function(_9){if(this.evalScripts){$(_2.target).attr("innerHTML",_9).evalScripts().each(_8,arguments);}else{$(_2.target).html(_9).each(_8,arguments);}});}else{if(_2.success){callbacks.push(_2.success);}}_2.success=function(_a,_b){for(var i=0,max=callbacks.length;i<max;i++){callbacks[i](_a,_b,_7);}};var _d=$("input:file",this).fieldValue();var _e=false;for(var j=0;j<_d.length;j++){if(_d[j]){_e=true;}}if(_2.iframe||_e){fileUpload();}else{$.ajax(_2);}$.event.trigger("form.submit.notify",[this,_2]);return this;function fileUpload(){var _10=_7[0];var _11=$.extend({},$.ajaxSettings,_2);var id="jqFormIO"+$.fn.ajaxSubmit.counter++;var $io=$("<iframe id=\""+id+"\" name=\""+id+"\" />");var io=$io[0];var op8=$.browser.opera&&window.opera.version()<9;if($.browser.msie||op8){io.src="javascript:false;document.write(\"\");";}$io.css({position:"absolute",top:"-1000px",left:"-1000px"});var xhr={responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){}};var g=_11.global;if(g&&!$.active++){$.event.trigger("ajaxStart");}if(g){$.event.trigger("ajaxSend",[xhr,_11]);}var _18=0;var _19=0;setTimeout(function(){$io.appendTo("body");io.attachEvent?io.attachEvent("onload",cb):io.addEventListener("load",cb,false);var _1a=_10.encoding?"encoding":"enctype";var t=_7.attr("target");_7.attr({target:id,method:"POST",action:_11.url});_10[_1a]="multipart/form-data";if(_11.timeout){setTimeout(function(){_19=true;cb();},_11.timeout);}_10.submit();_7.attr("target",t);},10);function cb(){if(_18++){return;}io.detachEvent?io.detachEvent("onload",cb):io.removeEventListener("load",cb,false);var ok=true;try{if(_19){throw "timeout";}var _1d,doc;doc=io.contentWindow?io.contentWindow.document:io.contentDocument?io.contentDocument:io.document;xhr.responseText=doc.body?doc.body.innerHTML:null;xhr.responseXML=doc.XMLDocument?doc.XMLDocument:doc;if(_11.dataType=="json"||_11.dataType=="script"){var ta=doc.getElementsByTagName("textarea")[0];_1d=ta?ta.value:xhr.responseText;if(_11.dataType=="json"){eval("data = "+_1d);}else{$.globalEval(_1d);}}else{if(_11.dataType=="xml"){_1d=xhr.responseXML;if(!_1d&&xhr.responseText!=null){_1d=toXml(xhr.responseText);}}else{_1d=xhr.responseText;}}}catch(e){ok=false;$.handleError(_11,xhr,"error",e);}if(ok){_11.success(_1d,"success");if(g){$.event.trigger("ajaxSuccess",[xhr,_11]);}}if(g){$.event.trigger("ajaxComplete",[xhr,_11]);}if(g&&!--$.active){$.event.trigger("ajaxStop");}if(_11.complete){_11.complete(xhr,ok?"success":"error");}setTimeout(function(){$io.remove();xhr.responseXML=null;},100);}function toXml(s,doc){if(window.ActiveXObject){doc=new ActiveXObject("Microsoft.XMLDOM");doc.async="false";doc.loadXML(s);}else{doc=(new DOMParser()).parseFromString(s,"text/xml");}return (doc&&doc.documentElement&&doc.documentElement.tagName!="parsererror")?doc:null;}}};$.fn.ajaxSubmit.counter=0;$.fn.ajaxForm=function(_21){return this.ajaxFormUnbind().submit(submitHandler).each(function(){this.formPluginId=$.fn.ajaxForm.counter++;$.fn.ajaxForm.optionHash[this.formPluginId]=_21;$(":submit,input:image",this).click(clickHandler);});};$.fn.ajaxForm.counter=1;$.fn.ajaxForm.optionHash={};function clickHandler(e){var _23=this.form;_23.clk=this;if(this.type=="image"){if(e.offsetX!=undefined){_23.clk_x=e.offsetX;_23.clk_y=e.offsetY;}else{if(typeof $.fn.offset=="function"){var _24=$(this).offset();_23.clk_x=e.pageX-_24.left;_23.clk_y=e.pageY-_24.top;}else{_23.clk_x=e.pageX-this.offsetLeft;_23.clk_y=e.pageY-this.offsetTop;}}}setTimeout(function(){_23.clk=_23.clk_x=_23.clk_y=null;},10);}function submitHandler(){var id=this.formPluginId;var _26=$.fn.ajaxForm.optionHash[id];$(this).ajaxSubmit(_26);return false;}$.fn.ajaxFormUnbind=function(){this.unbind("submit",submitHandler);return this.each(function(){$(":submit,input:image",this).unbind("click",clickHandler);});};$.fn.formToArray=function(_27){var a=[];if(this.length==0){return a;}var _29=this[0];var els=_27?_29.getElementsByTagName("*"):_29.elements;if(!els){return a;}for(var i=0,max=els.length;i<max;i++){var el=els[i];var n=el.name;if(!n){continue;}if(_27&&_29.clk&&el.type=="image"){if(!el.disabled&&_29.clk==el){a.push({name:n+".x",value:_29.clk_x},{name:n+".y",value:_29.clk_y});}continue;}var v=$.fieldValue(el,true);if(v&&v.constructor==Array){for(var j=0,jmax=v.length;j<jmax;j++){a.push({name:n,value:v[j]});}}else{if(v!==null&&typeof v!="undefined"){a.push({name:n,value:v});}}}if(!_27&&_29.clk){var _30=_29.getElementsByTagName("input");for(var i=0,max=_30.length;i<max;i++){var _32=_30[i];var n=_32.name;if(n&&!_32.disabled&&_32.type=="image"&&_29.clk==_32){a.push({name:n+".x",value:_29.clk_x},{name:n+".y",value:_29.clk_y});}}}return a;};$.fn.formSerialize=function(_34){return $.param(this.formToArray(_34));};$.fn.fieldSerialize=function(_35){var a=[];this.each(function(){var n=this.name;if(!n){return;}var v=$.fieldValue(this,_35);if(v&&v.constructor==Array){for(var i=0,max=v.length;i<max;i++){a.push({name:n,value:v[i]});}}else{if(v!==null&&typeof v!="undefined"){a.push({name:this.name,value:v});}}});return $.param(a);};$.fn.fieldValue=function(_3a){for(var val=[],i=0,max=this.length;i<max;i++){var el=this[i];var v=$.fieldValue(el,_3a);if(v===null||typeof v=="undefined"||(v.constructor==Array&&!v.length)){continue;}v.constructor==Array?$.merge(val,v):val.push(v);}return val;};$.fieldValue=function(el,_3f){var n=el.name,t=el.type,tag=el.tagName.toLowerCase();if(typeof _3f=="undefined"){_3f=true;}if(_3f&&(!n||el.disabled||t=="reset"||t=="button"||(t=="checkbox"||t=="radio")&&!el.checked||(t=="submit"||t=="image")&&el.form&&el.form.clk!=el||tag=="select"&&el.selectedIndex==-1)){return null;}if(tag=="select"){var _41=el.selectedIndex;if(_41<0){return null;}var a=[],ops=el.options;var one=(t=="select-one");var max=(one?_41+1:ops.length);for(var i=(one?_41:0);i<max;i++){var op=ops[i];if(op.selected){var v=$.browser.msie&&!(op.attributes["value"].specified)?op.text:op.value;if(one){return v;}a.push(v);}}return a;}return el.value;};$.fn.clearForm=function(){return this.each(function(){$("input,select,textarea",this).clearFields();});};$.fn.clearFields=$.fn.clearInputs=function(){return this.each(function(){var t=this.type,tag=this.tagName.toLowerCase();if(t=="text"||t=="password"||tag=="textarea"){this.value="";}else{if(t=="checkbox"||t=="radio"){this.checked=false;}else{if(tag=="select"){this.selectedIndex=-1;}}}});};$.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset();}});};})(jQuery);
    18.5 \ No newline at end of file
    19.1 --- a/web/javascript/form.js	Tue Oct 27 21:29:13 2009 -0700
    19.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    19.3 @@ -1,819 +0,0 @@
    19.4 -/*
    19.5 - * jQuery Form Plugin
    19.6 - * @requires jQuery v1.1 or later
    19.7 - *
    19.8 - * Examples at: http://malsup.com/jquery/form/
    19.9 - * Dual licensed under the MIT and GPL licenses:
   19.10 - *   http://www.opensource.org/licenses/mit-license.php
   19.11 - *   http://www.gnu.org/licenses/gpl.html
   19.12 - *
   19.13 - * Revision: $Id$
   19.14 - */
   19.15 - (function($) {
   19.16 -/**
   19.17 - * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
   19.18 - *
   19.19 - * ajaxSubmit accepts a single argument which can be either a success callback function
   19.20 - * or an options Object.  If a function is provided it will be invoked upon successful
   19.21 - * completion of the submit and will be passed the response from the server.
   19.22 - * If an options Object is provided, the following attributes are supported:
   19.23 - *
   19.24 - *  target:   Identifies the element(s) in the page to be updated with the server response.
   19.25 - *            This value may be specified as a jQuery selection string, a jQuery object,
   19.26 - *            or a DOM element.
   19.27 - *            default value: null
   19.28 - *
   19.29 - *  url:      URL to which the form data will be submitted.
   19.30 - *            default value: value of form's 'action' attribute
   19.31 - *
   19.32 - *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
   19.33 - *            default value: value of form's 'method' attribute (or 'GET' if none found)
   19.34 - *
   19.35 - *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
   19.36 - *
   19.37 - *  beforeSubmit:  Callback method to be invoked before the form is submitted.
   19.38 - *            default value: null
   19.39 - *
   19.40 - *  success:  Callback method to be invoked after the form has been successfully submitted
   19.41 - *            and the response has been returned from the server
   19.42 - *            default value: null
   19.43 - *
   19.44 - *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
   19.45 - *            default value: null
   19.46 - *
   19.47 - *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
   19.48 - *            default value: false
   19.49 - *
   19.50 - *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
   19.51 - *
   19.52 - *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
   19.53 - *
   19.54 - *
   19.55 - * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
   19.56 - * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
   19.57 - * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
   19.58 - * in array format, the jQuery object, and the options object passed into ajaxSubmit.
   19.59 - * The form data array takes the following form:
   19.60 - *
   19.61 - *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
   19.62 - *
   19.63 - * If a 'success' callback method is provided it is invoked after the response has been returned
   19.64 - * from the server.  It is passed the responseText or responseXML value (depending on dataType).
   19.65 - * See jQuery.ajax for further details.
   19.66 - *
   19.67 - *
   19.68 - * The dataType option provides a means for specifying how the server response should be handled.
   19.69 - * This maps directly to the jQuery.httpData method.  The following values are supported:
   19.70 - *
   19.71 - *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
   19.72 - *                   callback method, if specified, will be passed the responseXML value
   19.73 - *      'json':   if dataType == 'json' the server response will be evaluted and passed to
   19.74 - *                   the 'success' callback, if specified
   19.75 - *      'script': if dataType == 'script' the server response is evaluated in the global context
   19.76 - *
   19.77 - *
   19.78 - * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
   19.79 - * are provided the target will be ignored.
   19.80 - *
   19.81 - * The semantic argument can be used to force form serialization in semantic order.
   19.82 - * This is normally true anyway, unless the form contains input elements of type='image'.
   19.83 - * If your form must be submitted with name/value pairs in semantic order and your form
   19.84 - * contains an input of type='image" then pass true for this arg, otherwise pass false
   19.85 - * (or nothing) to avoid the overhead for this logic.
   19.86 - *
   19.87 - *
   19.88 - * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
   19.89 - *
   19.90 - * $("#form-id").submit(function() {
   19.91 - *     $(this).ajaxSubmit(options);
   19.92 - *     return false; // cancel conventional submit
   19.93 - * });
   19.94 - *
   19.95 - * When using ajaxForm(), however, this is done for you.
   19.96 - *
   19.97 - * @example
   19.98 - * $('#myForm').ajaxSubmit(function(data) {
   19.99 - *     alert('Form submit succeeded! Server returned: ' + data);
  19.100 - * });
  19.101 - * @desc Submit form and alert server response
  19.102 - *
  19.103 - *
  19.104 - * @example
  19.105 - * var options = {
  19.106 - *     target: '#myTargetDiv'
  19.107 - * };
  19.108 - * $('#myForm').ajaxSubmit(options);
  19.109 - * @desc Submit form and update page element with server response
  19.110 - *
  19.111 - *
  19.112 - * @example
  19.113 - * var options = {
  19.114 - *     success: function(responseText) {
  19.115 - *         alert(responseText);
  19.116 - *     }
  19.117 - * };
  19.118 - * $('#myForm').ajaxSubmit(options);
  19.119 - * @desc Submit form and alert the server response
  19.120 - *
  19.121 - *
  19.122 - * @example
  19.123 - * var options = {
  19.124 - *     beforeSubmit: function(formArray, jqForm) {
  19.125 - *         if (formArray.length == 0) {
  19.126 - *             alert('Please enter data.');
  19.127 - *             return false;
  19.128 - *         }
  19.129 - *     }
  19.130 - * };
  19.131 - * $('#myForm').ajaxSubmit(options);
  19.132 - * @desc Pre-submit validation which aborts the submit operation if form data is empty
  19.133 - *
  19.134 - *
  19.135 - * @example
  19.136 - * var options = {
  19.137 - *     url: myJsonUrl.php,
  19.138 - *     dataType: 'json',
  19.139 - *     success: function(data) {
  19.140 - *        // 'data' is an object representing the the evaluated json data
  19.141 - *     }
  19.142 - * };
  19.143 - * $('#myForm').ajaxSubmit(options);
  19.144 - * @desc json data returned and evaluated
  19.145 - *
  19.146 - *
  19.147 - * @example
  19.148 - * var options = {
  19.149 - *     url: myXmlUrl.php,
  19.150 - *     dataType: 'xml',
  19.151 - *     success: function(responseXML) {
  19.152 - *        // responseXML is XML document object
  19.153 - *        var data = $('myElement', responseXML).text();
  19.154 - *     }
  19.155 - * };
  19.156 - * $('#myForm').ajaxSubmit(options);
  19.157 - * @desc XML data returned from server
  19.158 - *
  19.159 - *
  19.160 - * @example
  19.161 - * var options = {
  19.162 - *     resetForm: true
  19.163 - * };
  19.164 - * $('#myForm').ajaxSubmit(options);
  19.165 - * @desc submit form and reset it if successful
  19.166 - *
  19.167 - * @example
  19.168 - * $('#myForm).submit(function() {
  19.169 - *    $(this).ajaxSubmit();
  19.170 - *    return false;
  19.171 - * });
  19.172 - * @desc Bind form's submit event to use ajaxSubmit
  19.173 - *
  19.174 - *
  19.175 - * @name ajaxSubmit
  19.176 - * @type jQuery
  19.177 - * @param options  object literal containing options which control the form submission process
  19.178 - * @cat Plugins/Form
  19.179 - * @return jQuery
  19.180 - */
  19.181 -$.fn.ajaxSubmit = function(options) {
  19.182 -    if (typeof options == 'function')
  19.183 -        options = { success: options };
  19.184 -
  19.185 -    options = $.extend({
  19.186 -        url:  this.attr('action') || window.location,
  19.187 -        type: this.attr('method') || 'GET'
  19.188 -    }, options || {});
  19.189 -
  19.190 -    // hook for manipulating the form data before it is extracted;
  19.191 -    // convenient for use with rich editors like tinyMCE or FCKEditor
  19.192 -    var veto = {};
  19.193 -    $.event.trigger('form.pre.serialize', [this, options, veto]);
  19.194 -    if (veto.veto) return this;
  19.195 -
  19.196 -    var a = this.formToArray(options.semantic);
  19.197 -	if (options.data) {
  19.198 -	    for (var n in options.data)
  19.199 -	        a.push( { name: n, value: options.data[n] } );
  19.200 -	}
  19.201 -
  19.202 -    // give pre-submit callback an opportunity to abort the submit
  19.203 -    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
  19.204 -
  19.205 -    // fire vetoable 'validate' event
  19.206 -    $.event.trigger('form.submit.validate', [a, this, options, veto]);
  19.207 -    if (veto.veto) return this;
  19.208 -
  19.209 -    var q = $.param(a);//.replace(/%20/g,'+');
  19.210 -
  19.211 -    if (options.type.toUpperCase() == 'GET') {
  19.212 -        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
  19.213 -        options.data = null;  // data is null for 'get'
  19.214 -    }
  19.215 -    else
  19.216 -        options.data = q; // data is the query string for 'post'
  19.217 -
  19.218 -    var $form = this, callbacks = [];
  19.219 -    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
  19.220 -    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
  19.221 -
  19.222 -    // perform a load on the target only if dataType is not provided
  19.223 -    if (!options.dataType && options.target) {
  19.224 -        var oldSuccess = options.success || function(){};
  19.225 -        callbacks.push(function(data) {
  19.226 -            if (this.evalScripts)
  19.227 -                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
  19.228 -            else // jQuery v1.1.4
  19.229 -                $(options.target).html(data).each(oldSuccess, arguments);
  19.230 -        });
  19.231 -    }
  19.232 -    else if (options.success)
  19.233 -        callbacks.push(options.success);
  19.234 -
  19.235 -    options.success = function(data, status) {
  19.236 -        for (var i=0, max=callbacks.length; i < max; i++)
  19.237 -            callbacks[i](data, status, $form);
  19.238 -    };
  19.239 -
  19.240 -    // are there files to upload?
  19.241 -    var files = $('input:file', this).fieldValue();
  19.242 -    var found = false;
  19.243 -    for (var j=0; j < files.length; j++)
  19.244 -        if (files[j])
  19.245 -            found = true;
  19.246 -
  19.247 -    if (options.iframe || found) // options.iframe allows user to force iframe mode
  19.248 -        fileUpload();
  19.249 -    else
  19.250 -        $.ajax(options);
  19.251 -
  19.252 -    // fire 'notify' event
  19.253 -    $.event.trigger('form.submit.notify', [this, options]);
  19.254 -    return this;
  19.255 -
  19.256 -
  19.257 -    // private function for handling file uploads (hat tip to YAHOO!)
  19.258 -    function fileUpload() {
  19.259 -        var form = $form[0];
  19.260 -        var opts = $.extend({}, $.ajaxSettings, options);
  19.261 -
  19.262 -        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
  19.263 -        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
  19.264 -        var io = $io[0];
  19.265 -        var op8 = $.browser.opera && window.opera.version() < 9;
  19.266 -        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
  19.267 -        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
  19.268 -
  19.269 -        var xhr = { // mock object
  19.270 -            responseText: null,
  19.271 -            responseXML: null,
  19.272 -            status: 0,
  19.273 -            statusText: 'n/a',
  19.274 -            getAllResponseHeaders: function() {},
  19.275 -            getResponseHeader: function() {},
  19.276 -            setRequestHeader: function() {}
  19.277 -        };
  19.278 -
  19.279 -        var g = opts.global;
  19.280 -        // trigger ajax global events so that activity/block indicators work like normal
  19.281 -        if (g && ! $.active++) $.event.trigger("ajaxStart");
  19.282 -        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
  19.283 -
  19.284 -        var cbInvoked = 0;
  19.285 -        var timedOut = 0;
  19.286 -
  19.287 -        // take a breath so that pending repaints get some cpu time before the upload starts
  19.288 -        setTimeout(function() {
  19.289 -            $io.appendTo('body');
  19.290 -            // jQuery's event binding doesn't work for iframe events in IE
  19.291 -            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
  19.292 -
  19.293 -            // make sure form attrs are set
  19.294 -            var encAttr = form.encoding ? 'encoding' : 'enctype';
  19.295 -            var t = $form.attr('target');
  19.296 -            $form.attr({
  19.297 -                target:   id,
  19.298 -                method:  'POST',
  19.299 -                action:   opts.url
  19.300 -            });
  19.301 -            form[encAttr] = 'multipart/form-data';
  19.302 -
  19.303 -            // support timout
  19.304 -            if (opts.timeout)
  19.305 -                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
  19.306 -
  19.307 -            form.submit();
  19.308 -            $form.attr('target', t); // reset target
  19.309 -        }, 10);
  19.310 -
  19.311 -        function cb() {
  19.312 -            if (cbInvoked++) return;
  19.313 -
  19.314 -            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
  19.315 -
  19.316 -            var ok = true;
  19.317 -            try {
  19.318 -                if (timedOut) throw 'timeout';
  19.319 -                // extract the server response from the iframe
  19.320 -                var data, doc;
  19.321 -                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
  19.322 -                xhr.responseText = doc.body ? doc.body.innerHTML : null;
  19.323 -                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
  19.324 -
  19.325 -                if (opts.dataType == 'json' || opts.dataType == 'script') {
  19.326 -                    var ta = doc.getElementsByTagName('textarea')[0];
  19.327 -                    data = ta ? ta.value : xhr.responseText;
  19.328 -                    if (opts.dataType == 'json')
  19.329 -                        eval("data = " + data);
  19.330 -                    else
  19.331 -                        $.globalEval(data);
  19.332 -                }
  19.333 -                else if (opts.dataType == 'xml') {
  19.334 -                    data = xhr.responseXML;
  19.335 -                    if (!data && xhr.responseText != null)
  19.336 -                        data = toXml(xhr.responseText);
  19.337 -                }
  19.338 -                else {
  19.339 -                    data = xhr.responseText;
  19.340 -                }
  19.341 -            }
  19.342 -            catch(e){
  19.343 -                ok = false;
  19.344 -                $.handleError(opts, xhr, 'error', e);
  19.345 -            }
  19.346 -
  19.347 -            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
  19.348 -            if (ok) {
  19.349 -                opts.success(data, 'success');
  19.350 -                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
  19.351 -            }
  19.352 -            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
  19.353 -            if (g && ! --$.active) $.event.trigger("ajaxStop");
  19.354 -            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
  19.355 -
  19.356 -            // clean up
  19.357 -            setTimeout(function() {
  19.358 -                $io.remove();
  19.359 -                xhr.responseXML = null;
  19.360 -            }, 100);
  19.361 -        };
  19.362 -
  19.363 -        function toXml(s, doc) {
  19.364 -            if (window.ActiveXObject) {
  19.365 -                doc = new ActiveXObject('Microsoft.XMLDOM');
  19.366 -                doc.async = 'false';
  19.367 -                doc.loadXML(s);
  19.368 -            }
  19.369 -            else
  19.370 -                doc = (new DOMParser()).parseFromString(s, 'text/xml');
  19.371 -            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
  19.372 -        };
  19.373 -    };
  19.374 -};
  19.375 -$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
  19.376 -
  19.377 -/**
  19.378 - * ajaxForm() provides a mechanism for fully automating form submission.
  19.379 - *
  19.380 - * The advantages of using this method instead of ajaxSubmit() are:
  19.381 - *
  19.382 - * 1: This method will include coordinates for <input type="image" /> elements (if the element
  19.383 - *    is used to submit the form).
  19.384 - * 2. This method will include the submit element's name/value data (for the element that was
  19.385 - *    used to submit the form).
  19.386 - * 3. This method binds the submit() method to the form for you.
  19.387 - *
  19.388 - * Note that for accurate x/y coordinates of image submit elements in all browsers
  19.389 - * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
  19.390 - *
  19.391 - * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
  19.392 - * passes the options argument along after properly binding events for submit elements and
  19.393 - * the form itself.  See ajaxSubmit for a full description of the options argument.
  19.394 - *
  19.395 - *
  19.396 - * @example
  19.397 - * var options = {
  19.398 - *     target: '#myTargetDiv'
  19.399 - * };
  19.400 - * $('#myForm').ajaxSForm(options);
  19.401 - * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
  19.402 - *       when the form is submitted.
  19.403 - *
  19.404 - *
  19.405 - * @example
  19.406 - * var options = {
  19.407 - *     success: function(responseText) {
  19.408 - *         alert(responseText);
  19.409 - *     }
  19.410 - * };
  19.411 - * $('#myForm').ajaxSubmit(options);
  19.412 - * @desc Bind form's submit event so that server response is alerted after the form is submitted.
  19.413 - *
  19.414 - *
  19.415 - * @example
  19.416 - * var options = {
  19.417 - *     beforeSubmit: function(formArray, jqForm) {
  19.418 - *         if (formArray.length == 0) {
  19.419 - *             alert('Please enter data.');
  19.420 - *             return false;
  19.421 - *         }
  19.422 - *     }
  19.423 - * };
  19.424 - * $('#myForm').ajaxSubmit(options);
  19.425 - * @desc Bind form's submit event so that pre-submit callback is invoked before the form
  19.426 - *       is submitted.
  19.427 - *
  19.428 - *
  19.429 - * @name   ajaxForm
  19.430 - * @param  options  object literal containing options which control the form submission process
  19.431 - * @return jQuery
  19.432 - * @cat    Plugins/Form
  19.433 - * @type   jQuery
  19.434 - */
  19.435 -$.fn.ajaxForm = function(options) {
  19.436 -    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
  19.437 -        // store options in hash
  19.438 -        this.formPluginId = $.fn.ajaxForm.counter++;
  19.439 -        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
  19.440 -        $(":submit,input:image", this).click(clickHandler);
  19.441 -    });
  19.442 -};
  19.443 -
  19.444 -$.fn.ajaxForm.counter = 1;
  19.445 -$.fn.ajaxForm.optionHash = {};
  19.446 -
  19.447 -function clickHandler(e) {
  19.448 -    var $form = this.form;
  19.449 -    $form.clk = this;
  19.450 -    if (this.type == 'image') {
  19.451 -        if (e.offsetX != undefined) {
  19.452 -            $form.clk_x = e.offsetX;
  19.453 -            $form.clk_y = e.offsetY;
  19.454 -        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
  19.455 -            var offset = $(this).offset();
  19.456 -            $form.clk_x = e.pageX - offset.left;
  19.457 -            $form.clk_y = e.pageY - offset.top;
  19.458 -        } else {
  19.459 -            $form.clk_x = e.pageX - this.offsetLeft;
  19.460 -            $form.clk_y = e.pageY - this.offsetTop;
  19.461 -        }
  19.462 -    }
  19.463 -    // clear form vars
  19.464 -    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
  19.465 -};
  19.466 -
  19.467 -function submitHandler() {
  19.468 -    // retrieve options from hash
  19.469 -    var id = this.formPluginId;
  19.470 -    var options = $.fn.ajaxForm.optionHash[id];
  19.471 -    $(this).ajaxSubmit(options);
  19.472 -    return false;
  19.473 -};
  19.474 -
  19.475 -/**
  19.476 - * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
  19.477 - *
  19.478 - * @name   ajaxFormUnbind
  19.479 - * @return jQuery
  19.480 - * @cat    Plugins/Form
  19.481 - * @type   jQuery
  19.482 - */
  19.483 -$.fn.ajaxFormUnbind = function() {
  19.484 -    this.unbind('submit', submitHandler);
  19.485 -    return this.each(function() {
  19.486 -        $(":submit,input:image", this).unbind('click', clickHandler);
  19.487 -    });
  19.488 -
  19.489 -};
  19.490 -
  19.491 -/**
  19.492 - * formToArray() gathers form element data into an array of objects that can
  19.493 - * be passed to any of the following ajax functions: $.get, $.post, or load.
  19.494 - * Each object in the array has both a 'name' and 'value' property.  An example of
  19.495 - * an array for a simple login form might be:
  19.496 - *
  19.497 - * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  19.498 - *
  19.499 - * It is this array that is passed to pre-submit callback functions provided to the
  19.500 - * ajaxSubmit() and ajaxForm() methods.
  19.501 - *
  19.502 - * The semantic argument can be used to force form serialization in semantic order.
  19.503 - * This is normally true anyway, unless the form contains input elements of type='image'.
  19.504 - * If your form must be submitted with name/value pairs in semantic order and your form
  19.505 - * contains an input of type='image" then pass true for this arg, otherwise pass false
  19.506 - * (or nothing) to avoid the overhead for this logic.
  19.507 - *
  19.508 - * @example var data = $("#myForm").formToArray();
  19.509 - * $.post( "myscript.cgi", data );
  19.510 - * @desc Collect all the data from a form and submit it to the server.
  19.511 - *
  19.512 - * @name formToArray
  19.513 - * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  19.514 - * @type Array<Object>
  19.515 - * @cat Plugins/Form
  19.516 - */
  19.517 -$.fn.formToArray = function(semantic) {
  19.518 -    var a = [];
  19.519 -    if (this.length == 0) return a;
  19.520 -
  19.521 -    var form = this[0];
  19.522 -    var els = semantic ? form.getElementsByTagName('*') : form.elements;
  19.523 -    if (!els) return a;
  19.524 -    for(var i=0, max=els.length; i < max; i++) {
  19.525 -        var el = els[i];
  19.526 -        var n = el.name;
  19.527 -        if (!n) continue;
  19.528 -
  19.529 -        if (semantic && form.clk && el.type == "image") {
  19.530 -            // handle image inputs on the fly when semantic == true
  19.531 -            if(!el.disabled && form.clk == el)
  19.532 -                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  19.533 -            continue;
  19.534 -        }
  19.535 -
  19.536 -        var v = $.fieldValue(el, true);
  19.537 -        if (v && v.constructor == Array) {
  19.538 -            for(var j=0, jmax=v.length; j < jmax; j++)
  19.539 -                a.push({name: n, value: v[j]});
  19.540 -        }
  19.541 -        else if (v !== null && typeof v != 'undefined')
  19.542 -            a.push({name: n, value: v});
  19.543 -    }
  19.544 -
  19.545 -    if (!semantic && form.clk) {
  19.546 -        // input type=='image' are not found in elements array! handle them here
  19.547 -        var inputs = form.getElementsByTagName("input");
  19.548 -        for(var i=0, max=inputs.length; i < max; i++) {
  19.549 -            var input = inputs[i];
  19.550 -            var n = input.name;
  19.551 -            if(n && !input.disabled && input.type == "image" && form.clk == input)
  19.552 -                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  19.553 -        }
  19.554 -    }
  19.555 -    return a;
  19.556 -};
  19.557 -
  19.558 -
  19.559 -/**
  19.560 - * Serializes form data into a 'submittable' string. This method will return a string
  19.561 - * in the format: name1=value1&amp;name2=value2
  19.562 - *
  19.563 - * The semantic argument can be used to force form serialization in semantic order.
  19.564 - * If your form must be submitted with name/value pairs in semantic order then pass
  19.565 - * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
  19.566 - * this logic (which can be significant for very large forms).
  19.567 - *
  19.568 - * @example var data = $("#myForm").formSerialize();
  19.569 - * $.ajax('POST', "myscript.cgi", data);
  19.570 - * @desc Collect all the data from a form into a single string
  19.571 - *
  19.572 - * @name formSerialize
  19.573 - * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  19.574 - * @type String
  19.575 - * @cat Plugins/Form
  19.576 - */
  19.577 -$.fn.formSerialize = function(semantic) {
  19.578 -    //hand off to jQuery.param for proper encoding
  19.579 -    return $.param(this.formToArray(semantic));
  19.580 -};
  19.581 -
  19.582 -
  19.583 -/**
  19.584 - * Serializes all field elements in the jQuery object into a query string.
  19.585 - * This method will return a string in the format: name1=value1&amp;name2=value2
  19.586 - *
  19.587 - * The successful argument controls whether or not serialization is limited to
  19.588 - * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  19.589 - * The default value of the successful argument is true.
  19.590 - *
  19.591 - * @example var data = $("input").formSerialize();
  19.592 - * @desc Collect the data from all successful input elements into a query string
  19.593 - *
  19.594 - * @example var data = $(":radio").formSerialize();
  19.595 - * @desc Collect the data from all successful radio input elements into a query string
  19.596 - *
  19.597 - * @example var data = $("#myForm :checkbox").formSerialize();
  19.598 - * @desc Collect the data from all successful checkbox input elements in myForm into a query string
  19.599 - *
  19.600 - * @example var data = $("#myForm :checkbox").formSerialize(false);
  19.601 - * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
  19.602 - *
  19.603 - * @example var data = $(":input").formSerialize();
  19.604 - * @desc Collect the data from all successful input, select, textarea and button elements into a query string
  19.605 - *
  19.606 - * @name fieldSerialize
  19.607 - * @param successful true if only successful controls should be serialized (default is true)
  19.608 - * @type String
  19.609 - * @cat Plugins/Form
  19.610 - */
  19.611 -$.fn.fieldSerialize = function(successful) {
  19.612 -    var a = [];
  19.613 -    this.each(function() {
  19.614 -        var n = this.name;
  19.615 -        if (!n) return;
  19.616 -        var v = $.fieldValue(this, successful);
  19.617 -        if (v && v.constructor == Array) {
  19.618 -            for (var i=0,max=v.length; i < max; i++)
  19.619 -                a.push({name: n, value: v[i]});
  19.620 -        }
  19.621 -        else if (v !== null && typeof v != 'undefined')
  19.622 -            a.push({name: this.name, value: v});
  19.623 -    });
  19.624 -    //hand off to jQuery.param for proper encoding
  19.625 -    return $.param(a);
  19.626 -};
  19.627 -
  19.628 -
  19.629 -/**
  19.630 - * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  19.631 - *
  19.632 - *  <form><fieldset>
  19.633 - *      <input name="A" type="text" />
  19.634 - *      <input name="A" type="text" />
  19.635 - *      <input name="B" type="checkbox" value="B1" />
  19.636 - *      <input name="B" type="checkbox" value="B2"/>
  19.637 - *      <input name="C" type="radio" value="C1" />
  19.638 - *      <input name="C" type="radio" value="C2" />
  19.639 - *  </fieldset></form>
  19.640 - *
  19.641 - *  var v = $(':text').fieldValue();
  19.642 - *  // if no values are entered into the text inputs
  19.643 - *  v == ['','']
  19.644 - *  // if values entered into the text inputs are 'foo' and 'bar'
  19.645 - *  v == ['foo','bar']
  19.646 - *
  19.647 - *  var v = $(':checkbox').fieldValue();
  19.648 - *  // if neither checkbox is checked
  19.649 - *  v === undefined
  19.650 - *  // if both checkboxes are checked
  19.651 - *  v == ['B1', 'B2']
  19.652 - *
  19.653 - *  var v = $(':radio').fieldValue();
  19.654 - *  // if neither radio is checked
  19.655 - *  v === undefined
  19.656 - *  // if first radio is checked
  19.657 - *  v == ['C1']
  19.658 - *
  19.659 - * The successful argument controls whether or not the field element must be 'successful'
  19.660 - * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  19.661 - * The default value of the successful argument is true.  If this value is false the value(s)
  19.662 - * for each element is returned.
  19.663 - *
  19.664 - * Note: This method *always* returns an array.  If no valid value can be determined the
  19.665 - *       array will be empty, otherwise it will contain one or more values.
  19.666 - *
  19.667 - * @example var data = $("#myPasswordElement").fieldValue();
  19.668 - * alert(data[0]);
  19.669 - * @desc Alerts the current value of the myPasswordElement element
  19.670 - *
  19.671 - * @example var data = $("#myForm :input").fieldValue();
  19.672 - * @desc Get the value(s) of the form elements in myForm
  19.673 - *
  19.674 - * @example var data = $("#myForm :checkbox").fieldValue();
  19.675 - * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
  19.676 - *
  19.677 - * @example var data = $("#mySingleSelect").fieldValue();
  19.678 - * @desc Get the value(s) of the select control
  19.679 - *
  19.680 - * @example var data = $(':text').fieldValue();
  19.681 - * @desc Get the value(s) of the text input or textarea elements
  19.682 - *
  19.683 - * @example var data = $("#myMultiSelect").fieldValue();
  19.684 - * @desc Get the values for the select-multiple control
  19.685 - *
  19.686 - * @name fieldValue
  19.687 - * @param Boolean successful true if only the values for successful controls should be returned (default is true)
  19.688 - * @type Array<String>
  19.689 - * @cat Plugins/Form
  19.690 - */
  19.691 -$.fn.fieldValue = function(successful) {
  19.692 -    for (var val=[], i=0, max=this.length; i < max; i++) {
  19.693 -        var el = this[i];
  19.694 -        var v = $.fieldValue(el, successful);
  19.695 -        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
  19.696 -            continue;
  19.697 -        v.constructor == Array ? $.merge(val, v) : val.push(v);
  19.698 -    }
  19.699 -    return val;
  19.700 -};
  19.701 -
  19.702 -/**
  19.703 - * Returns the value of the field element.
  19.704 - *
  19.705 - * The successful argument controls whether or not the field element must be 'successful'
  19.706 - * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  19.707 - * The default value of the successful argument is true.  If the given element is not
  19.708 - * successful and the successful arg is not false then the returned value will be null.
  19.709 - *
  19.710 - * Note: If the successful flag is true (default) but the element is not successful, the return will be null
  19.711 - * Note: The value returned for a successful select-multiple element will always be an array.
  19.712 - * Note: If the element has no value the return value will be undefined.
  19.713 - *
  19.714 - * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
  19.715 - * @desc Gets the current value of the myPasswordElement element
  19.716 - *
  19.717 - * @name fieldValue
  19.718 - * @param Element el The DOM element for which the value will be returned
  19.719 - * @param Boolean successful true if value returned must be for a successful controls (default is true)
  19.720 - * @type String or Array<String> or null or undefined
  19.721 - * @cat Plugins/Form
  19.722 - */
  19.723 -$.fieldValue = function(el, successful) {
  19.724 -    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
  19.725 -    if (typeof successful == 'undefined') successful = true;
  19.726 -
  19.727 -    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
  19.728 -        (t == 'checkbox' || t == 'radio') && !el.checked ||
  19.729 -        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
  19.730 -        tag == 'select' && el.selectedIndex == -1))
  19.731 -            return null;
  19.732 -
  19.733 -    if (tag == 'select') {
  19.734 -        var index = el.selectedIndex;
  19.735 -        if (index < 0) return null;
  19.736 -        var a = [], ops = el.options;
  19.737 -        var one = (t == 'select-one');
  19.738 -        var max = (one ? index+1 : ops.length);
  19.739 -        for(var i=(one ? index : 0); i < max; i++) {
  19.740 -            var op = ops[i];
  19.741 -            if (op.selected) {
  19.742 -                // extra pain for IE...
  19.743 -                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
  19.744 -                if (one) return v;
  19.745 -                a.push(v);
  19.746 -            }
  19.747 -        }
  19.748 -        return a;
  19.749 -    }
  19.750 -    return el.value;
  19.751 -};
  19.752 -
  19.753 -
  19.754 -/**
  19.755 - * Clears the form data.  Takes the following actions on the form's input fields:
  19.756 - *  - input text fields will have their 'value' property set to the empty string
  19.757 - *  - select elements will have their 'selectedIndex' property set to -1
  19.758 - *  - checkbox and radio inputs will have their 'checked' property set to false
  19.759 - *  - inputs of type submit, button, reset, and hidden will *not* be effected
  19.760 - *  - button elements will *not* be effected
  19.761 - *
  19.762 - * @example $('form').clearForm();
  19.763 - * @desc Clears all forms on the page.
  19.764 - *
  19.765 - * @name clearForm
  19.766 - * @type jQuery
  19.767 - * @cat Plugins/Form
  19.768 - */
  19.769 -$.fn.clearForm = function() {
  19.770 -    return this.each(function() {
  19.771 -        $('input,select,textarea', this).clearFields();
  19.772 -    });
  19.773 -};
  19.774 -
  19.775 -/**
  19.776 - * Clears the selected form elements.  Takes the following actions on the matched elements:
  19.777 - *  - input text fields will have their 'value' property set to the empty string
  19.778 - *  - select elements will have their 'selectedIndex' property set to -1
  19.779 - *  - checkbox and radio inputs will have their 'checked' property set to false
  19.780 - *  - inputs of type submit, button, reset, and hidden will *not* be effected
  19.781 - *  - button elements will *not* be effected
  19.782 - *
  19.783 - * @example $('.myInputs').clearFields();
  19.784 - * @desc Clears all inputs with class myInputs
  19.785 - *
  19.786 - * @name clearFields
  19.787 - * @type jQuery
  19.788 - * @cat Plugins/Form
  19.789 - */
  19.790 -$.fn.clearFields = $.fn.clearInputs = function() {
  19.791 -    return this.each(function() {
  19.792 -        var t = this.type, tag = this.tagName.toLowerCase();
  19.793 -        if (t == 'text' || t == 'password' || tag == 'textarea')
  19.794 -            this.value = '';
  19.795 -        else if (t == 'checkbox' || t == 'radio')
  19.796 -            this.checked = false;
  19.797 -        else if (tag == 'select')
  19.798 -            this.selectedIndex = -1;
  19.799 -    });
  19.800 -};
  19.801 -
  19.802 -
  19.803 -/**
  19.804 - * Resets the form data.  Causes all form elements to be reset to their original value.
  19.805 - *
  19.806 - * @example $('form').resetForm();
  19.807 - * @desc Resets all forms on the page.
  19.808 - *
  19.809 - * @name resetForm
  19.810 - * @type jQuery
  19.811 - * @cat Plugins/Form
  19.812 - */
  19.813 -$.fn.resetForm = function() {
  19.814 -    return this.each(function() {
  19.815 -        // guard against an input with the name of 'reset'
  19.816 -        // note that IE reports the reset function as an 'object'
  19.817 -        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
  19.818 -            this.reset();
  19.819 -    });
  19.820 -};
  19.821 -
  19.822 -})(jQuery);
    20.1 --- a/web/javascript/hsbook.js	Tue Oct 27 21:29:13 2009 -0700
    20.2 +++ b/web/javascript/hsbook.js	Tue Oct 27 21:31:06 2009 -0700
    20.3 @@ -65,10 +65,13 @@
    20.4    $("p[@id]").each(function() {
    20.5      $(this).append(loading($(this).attr("id")));
    20.6    });
    20.7 +  $("table[@id].equation").each(function() {
    20.8 +    $(this).after(loading($(this).attr("id")));
    20.9 +  });
   20.10    $("pre[@id]").each(function() {
   20.11      $(this).after(loading($(this).attr("id")));
   20.12    });
   20.13 -  var chapid = $("div.preface, div.chapter, div.appendix, div.bibliography").attr("id");
   20.14 +  var chapid = $("body, div.preface, div.chapter, div.appendix, div.bibliography").attr("id");
   20.15    $("#chapterfeed").attr("href",
   20.16  			 $("#chapterfeed").attr("href") + chapid + "/");
   20.17    $.getJSON(location.protocol + "//" + location.host + "/comments/chapter/" +
    21.1 --- a/web/javascript/jquery-min.js	Tue Oct 27 21:29:13 2009 -0700
    21.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    21.3 @@ -1,31 +0,0 @@
    21.4 -/*
    21.5 - * jQuery 1.2.1 - New Wave Javascript
    21.6 - *
    21.7 - * Copyright (c) 2007 John Resig (jquery.com)
    21.8 - * Dual licensed under the MIT (MIT-LICENSE.txt)
    21.9 - * and GPL (GPL-LICENSE.txt) licenses.
   21.10 - *
   21.11 - * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   21.12 - * $Rev: 3353 $
   21.13 - */
   21.14 -(function(){if(typeof jQuery!="undefined")var _jQuery=jQuery;var jQuery=window.jQuery=function(selector,context){return this instanceof jQuery?this.init(selector,context):new jQuery(selector,context);};if(typeof $!="undefined")var _$=$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(typeof selector=="string"){var m=quickExpr.exec(selector);if(m&&(m[1]||!context)){if(m[1])selector=jQuery.clean([m[1]],context);else{var tmp=document.getElementById(m[3]);if(tmp)if(tmp.id!=m[3])return jQuery().find(selector);else{this[0]=tmp;this.length=1;return this;}else
   21.15 -selector=[];}}else
   21.16 -return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.1",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(a){var ret=jQuery(a);ret.prevObject=this;return ret;},setArray:function(a){this.length=0;Array.prototype.push.apply(this,a);return this;},each:function(fn,args){return jQuery.each(this,fn,args);},index:function(obj){var pos=-1;this.each(function(i){if(this==obj)pos=i;});return pos;},attr:function(key,value,type){var obj=key;if(key.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],key)||undefined;else{obj={};obj[key]=value;}return this.each(function(index){for(var prop in obj)jQuery.attr(type?this.style:this,prop,jQuery.prop(this,obj[prop],type,index,prop));});},css:function(key,value){return this.attr(key,value,"curCSS");},text:function(e){if(typeof e!="object"&&e!=null)return this.empty().append(document.createTextNode(e));var t="";jQuery.each(e||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)t+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return t;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,1,function(a){this.appendChild(a);});},prepend:function(){return this.domManip(arguments,true,-1,function(a){this.insertBefore(a,this.firstChild);});},before:function(){return this.domManip(arguments,false,1,function(a){this.parentNode.insertBefore(a,this);});},after:function(){return this.domManip(arguments,false,-1,function(a){this.parentNode.insertBefore(a,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(t){var data=jQuery.map(this,function(a){return jQuery.find(t,a);});return this.pushStack(/[^+>] [^+>]/.test(t)||t.indexOf("..")>-1?jQuery.unique(data):data);},clone:function(events){var ret=this.map(function(){return this.outerHTML?jQuery(this.outerHTML)[0]:this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(t){return this.pushStack(jQuery.isFunction(t)&&jQuery.grep(this,function(el,index){return t.apply(el,[index]);})||jQuery.multiFilter(t,this));},not:function(t){return this.pushStack(t.constructor==String&&jQuery.multiFilter(t,this,true)||jQuery.grep(this,function(a){return(t.constructor==Array||t.jquery)?jQuery.inArray(a,t)<0:a!=t;}));},add:function(t){return this.pushStack(jQuery.merge(this.get(),t.constructor==String?jQuery(t).get():t.length!=undefined&&(!t.nodeName||jQuery.nodeName(t,"form"))?t:[t]));},is:function(expr){return expr?jQuery.multiFilter(expr,this).length>0:false;},hasClass:function(expr){return this.is("."+expr);},val:function(val){if(val==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,a=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){var val=jQuery.browser.msie&&!option.attributes["value"].specified?option.text:option.value;if(one)return val;a.push(val);}}return a;}else
   21.17 -return this[0].value.replace(/\r/g,"");}}else
   21.18 -return this.each(function(){if(val.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,val)>=0||jQuery.inArray(this.name,val)>=0);else if(jQuery.nodeName(this,"select")){var tmp=val.constructor==Array?val:[val];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,tmp)>=0||jQuery.inArray(this.text,tmp)>=0);});if(!tmp.length)this.selectedIndex=-1;}else
   21.19 -this.value=val;});},html:function(val){return val==undefined?(this.length?this[0].innerHTML:null):this.empty().append(val);},replaceWith:function(val){return this.after(val).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(fn){return this.pushStack(jQuery.map(this,function(elem,i){return fn.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,dir,fn){var clone=this.length>1,a;return this.each(function(){if(!a){a=jQuery.clean(args,this.ownerDocument);if(dir<0)a.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(a[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(document.createElement("tbody"));jQuery.each(a,function(){var elem=clone?this.cloneNode(true):this;if(!evalScript(0,elem))fn.call(obj,elem);});});}};function evalScript(i,elem){var script=jQuery.nodeName(elem,"script");if(script){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
   21.20 -jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}else if(elem.nodeType==1)jQuery("script",elem).each(evalScript);return script;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},a=1,al=arguments.length,deep=false;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};}if(al==1){target=this;a=0;}var prop;for(;a<al;a++)if((prop=arguments[a])!=null)for(var i in prop){if(target==prop[i])continue;if(deep&&typeof prop[i]=='object'&&target[i])jQuery.extend(target[i],prop[i]);else if(prop[i]!=undefined)target[i]=prop[i];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,win={};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){if(window.execScript)window.execScript(data);else if(jQuery.browser.safari)window.setTimeout(data,0);else
   21.21 -eval.call(window,data);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?win:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?win:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(obj,fn,args){if(args){if(obj.length==undefined)for(var i in obj)fn.apply(obj[i],args);else
   21.22 -for(var i=0,ol=obj.length;i<ol;i++)if(fn.apply(obj[i],args)===false)break;}else{if(obj.length==undefined)for(var i in obj)fn.call(obj[i],i,obj[i]);else
   21.23 -for(var i=0,ol=obj.length,val=obj[0];i<ol&&fn.call(val,i,val)!==false;val=obj[++i]){}}return obj;},prop:function(elem,value,type,index,prop){if(jQuery.isFunction(value))value=value.call(elem,[index]);var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(prop)?value+"px":value;},className:{add:function(elem,c){jQuery.each((c||"").split(/\s+/),function(i,cur){if(!jQuery.className.has(elem.className,cur))elem.className+=(elem.className?" ":"")+cur;});},remove:function(elem,c){elem.className=c!=undefined?jQuery.grep(elem.className.split(/\s+/),function(cur){return!jQuery.className.has(c,cur);}).join(" "):"";},has:function(t,c){return jQuery.inArray(c,(t.className||t).toString().split(/\s+/))>-1;}},swap:function(e,o,f){for(var i in o){e.style["old"+i]=e.style[i];e.style[i]=o[i];}f.apply(e,[]);for(var i in o)e.style[i]=e.style["old"+i];},css:function(e,p){if(p=="height"||p=="width"){var old={},oHeight,oWidth,d=["Top","Bottom","Right","Left"];jQuery.each(d,function(){old["padding"+this]=0;old["border"+this+"Width"]=0;});jQuery.swap(e,old,function(){if(jQuery(e).is(':visible')){oHeight=e.offsetHeight;oWidth=e.offsetWidth;}else{e=jQuery(e.cloneNode(true)).find(":radio").removeAttr("checked").end().css({visibility:"hidden",position:"absolute",display:"block",right:"0",left:"0"}).appendTo(e.parentNode)[0];var parPos=jQuery.css(e.parentNode,"position")||"static";if(parPos=="static")e.parentNode.style.position="relative";oHeight=e.clientHeight;oWidth=e.clientWidth;if(parPos=="static")e.parentNode.style.position="static";e.parentNode.removeChild(e);}});return p=="height"?oHeight:oWidth;}return jQuery.curCSS(e,p);},curCSS:function(elem,prop,force){var ret,stack=[],swap=[];function color(a){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(a,null);return!ret||ret.getPropertyValue("color")=="";}if(prop=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(prop.match(/float/i))prop=styleFloat;if(!force&&elem.style[prop])ret=elem.style[prop];else if(document.defaultView&&document.defaultView.getComputedStyle){if(prop.match(/float/i))prop="float";prop=prop.replace(/([A-Z])/g,"-$1").toLowerCase();var cur=document.defaultView.getComputedStyle(elem,null);if(cur&&!color(elem))ret=cur.getPropertyValue(prop);else{for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(a=0;a<stack.length;a++)if(color(stack[a])){swap[a]=stack[a].style.display;stack[a].style.display="block";}ret=prop=="display"&&swap[stack.length-1]!=null?"none":document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop)||"";for(a=0;a<swap.length;a++)if(swap[a]!=null)stack[a].style.display=swap[a];}if(prop=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var newProp=prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});ret=elem.currentStyle[prop]||elem.currentStyle[newProp];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left;var runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(a,doc){var r=[];doc=doc||document;jQuery.each(a,function(i,arg){if(!arg)return;if(arg.constructor==Number)arg=arg.toString();if(typeof arg=="string"){arg=arg.replace(/(<(\w+)[^>]*?)\/>/g,function(m,all,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)?m:all+"></"+tag+">";});var s=jQuery.trim(arg).toLowerCase(),div=doc.createElement("div"),tb=[];var wrap=!s.indexOf("<opt")&&[1,"<select>","</select>"]||!s.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||s.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!s.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!s.indexOf("<td")||!s.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!s.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+arg+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){if(!s.indexOf("<table")&&s.indexOf("<tbody")<0)tb=div.firstChild&&div.firstChild.childNodes;else if(wrap[1]=="<table>"&&s.indexOf("<tbody")<0)tb=div.childNodes;for(var n=tb.length-1;n>=0;--n)if(jQuery.nodeName(tb[n],"tbody")&&!tb[n].childNodes.length)tb[n].parentNode.removeChild(tb[n]);if(/^\s/.test(arg))div.insertBefore(doc.createTextNode(arg.match(/^\s*/)[0]),div.firstChild);}arg=jQuery.makeArray(div.childNodes);}if(0===arg.length&&(!jQuery.nodeName(arg,"form")&&!jQuery.nodeName(arg,"select")))return;if(arg[0]==undefined||jQuery.nodeName(arg,"form")||arg.options)r.push(arg);else
   21.24 -r=jQuery.merge(r,arg);});return r;},attr:function(elem,name,value){var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(t){return(t||"").replace(/^\s+|\s+$/g,"");},makeArray:function(a){var r=[];if(typeof a!="array")for(var i=0,al=a.length;i<al;i++)r.push(a[i]);else
   21.25 -r=a.slice(0);return r;},inArray:function(b,a){for(var i=0,al=a.length;i<al;i++)if(a[i]==b)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
   21.26 -for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(first){var r=[],done={};try{for(var i=0,fl=first.length;i<fl;i++){var id=jQuery.data(first[i]);if(!done[id]){done[id]=true;r.push(first[i]);}}}catch(e){r=first;}return r;},grep:function(elems,fn,inv){if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++)if(!inv&&fn(elems[i],i)||inv&&!fn(elems[i],i))result.push(elems[i]);return result;},map:function(elems,fn){if(typeof fn=="string")fn=eval("false||function(a){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++){var val=fn(elems[i],i);if(val!==null&&val!=undefined){if(val.constructor!=Array)val=[val];result=result.concat(val);}}return result;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",styleFloat:jQuery.browser.msie?"styleFloat":"cssFloat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength"}});jQuery.each({parent:"a.parentNode",parents:"jQuery.dir(a,'parentNode')",next:"jQuery.nth(a,2,'nextSibling')",prev:"jQuery.nth(a,2,'previousSibling')",nextAll:"jQuery.dir(a,'nextSibling')",prevAll:"jQuery.dir(a,'previousSibling')",siblings:"jQuery.sibling(a.parentNode.firstChild,a)",children:"jQuery.sibling(a.firstChild)",contents:"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"},function(i,n){jQuery.fn[i]=function(a){var ret=jQuery.map(this,n);if(a&&typeof a=="string")ret=jQuery.multiFilter(a,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(i,n){jQuery.fn[i]=function(){var a=arguments;return this.each(function(){for(var j=0,al=a.length;j<al;j++)jQuery(a[j])[n](this);});};});jQuery.each({removeAttr:function(key){jQuery.attr(this,key,"");this.removeAttribute(key);},addClass:function(c){jQuery.className.add(this,c);},removeClass:function(c){jQuery.className.remove(this,c);},toggleClass:function(c){jQuery.className[jQuery.className.has(this,c)?"remove":"add"](this,c);},remove:function(a){if(!a||jQuery.filter(a,[this]).r.length){jQuery.removeData(this);this.parentNode.removeChild(this);}},empty:function(){jQuery("*",this).each(function(){jQuery.removeData(this);});while(this.firstChild)this.removeChild(this.firstChild);}},function(i,n){jQuery.fn[i]=function(){return this.each(n,arguments);};});jQuery.each(["Height","Width"],function(i,name){var n=name.toLowerCase();jQuery.fn[n]=function(h){return this[0]==window?jQuery.browser.safari&&self["inner"+name]||jQuery.boxModel&&Math.max(document.documentElement["client"+name],document.body["client"+name])||document.body["client"+name]:this[0]==document?Math.max(document.body["scroll"+name],document.body["offset"+name]):h==undefined?(this.length?jQuery.css(this[0],n):null):this.css(n,h.constructor==String?h:h+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&!context.nodeType)context=null;context=context||document;var ret=[context],done=[],last;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){var nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName.toUpperCase()))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var nodeName=m[2],merge={};m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName.toUpperCase()){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=jQuery.filter(m[3],r,true).r;else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(\d*)n\+?(\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"n+"+m[3]||m[3]),first=(test[1]||1)-0,last=test[2]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==1){if(last==0||node.nodeIndex==last)add=true;}else if((node.nodeIndex+last)%first==0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(element,type,handler,data){if(jQuery.browser.msie&&element.setInterval!=undefined)element=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var parts=type.split(".");type=parts[0];handler.type=parts[1];var events=jQuery.data(element,"events")||jQuery.data(element,"events",{});var handle=jQuery.data(element,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(element,arguments);return val;});var handlers=events[type];if(!handlers){handlers=events[type]={};if(element.addEventListener)element.addEventListener(type,handle,false);else
   21.27 -element.attachEvent("on"+type,handle);}handlers[handler.guid]=handler;this.global[type]=true;},guid:1,global:{},remove:function(element,type,handler){var events=jQuery.data(element,"events"),ret,index;if(typeof type=="string"){var parts=type.split(".");type=parts[0];}if(events){if(type&&type.type){handler=type.handler;type=type.type;}if(!type){for(type in events)this.remove(element,type);}else if(events[type]){if(handler)delete events[type][handler.guid];else
   21.28 -for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(element.removeEventListener)element.removeEventListener(type,jQuery.data(element,"handle"),false);else
   21.29 -element.detachEvent("on"+type,jQuery.data(element,"handle"));ret=null;delete events[type];}}for(ret in events)break;if(!ret){jQuery.removeData(element,"events");jQuery.removeData(element,"handle");}}},trigger:function(type,data,element,donative,extra){data=jQuery.makeArray(data||[]);if(!element){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{var val,ret,fn=jQuery.isFunction(element[type]||null),evt=!data[0]||!data[0].preventDefault;if(evt)data.unshift(this.fix({type:type,target:element}));data[0].type=type;if(jQuery.isFunction(jQuery.data(element,"handle")))val=jQuery.data(element,"handle").apply(element,data);if(!fn&&element["on"+type]&&element["on"+type].apply(element,data)===false)val=false;if(evt)data.shift();if(extra&&extra.apply(element,data)===false)val=false;if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(element,'a')&&type=="click")){this.triggered=true;element[type]();}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var c=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in c){args[0].handler=c[j];args[0].data=c[j].data;if(!parts[1]||c[j].type==parts[1]){var tmp=c[j].apply(this,args);if(val!==false)val=tmp;if(tmp===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target&&event.srcElement)event.target=event.srcElement;if(jQuery.browser.safari&&event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var e=document.documentElement,b=document.body;event.pageX=event.clientX+(e&&e.scrollLeft||b.scrollLeft||0);event.pageY=event.clientY+(e&&e.scrollTop||b.scrollTop||0);}if(!event.which&&(event.charCode||event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(){var a=arguments;return this.click(function(e){this.lastToggle=0==this.lastToggle?1:0;e.preventDefault();return a[this.lastToggle].apply(this,[e])||false;});},hover:function(f,g){function handleHover(e){var p=e.relatedTarget;while(p&&p!=this)try{p=p.parentNode;}catch(e){p=this;};if(p==this)return false;return(e.type=="mouseover"?f:g).apply(this,[e]);}return this.mouseover(handleHover).mouseout(handleHover);},ready:function(f){bindReady();if(jQuery.isReady)f.apply(document,[jQuery]);else
   21.30 -jQuery.readyList.push(function(){return f.apply(this,[jQuery]);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}if(jQuery.browser.mozilla||jQuery.browser.opera)document.removeEventListener("DOMContentLoaded",jQuery.ready,false);if(!window.frames.length)jQuery(window).load(function(){jQuery("#__ie_init").remove();});}}});jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,o){jQuery.fn[o]=function(f){return f?this.bind(o,f):this.trigger(o);};});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(jQuery.browser.mozilla||jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);else if(jQuery.browser.msie){document.write("<scr"+"ipt id=__ie_init defer=true "+"src=//:><\/script>");var script=document.getElementById("__ie_init");if(script)script.onreadystatechange=function(){if(this.readyState!="complete")return;jQuery.ready();};script=null;}else if(jQuery.browser.safari)jQuery.safariTimer=setInterval(function(){if(document.readyState=="loaded"||document.readyState=="complete"){clearInterval(jQuery.safariTimer);jQuery.safariTimer=null;jQuery.ready();}},10);jQuery.event.add(window,"load",jQuery.ready);}jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null},lastModified:{},ajax:function(s){var jsonp,jsre=/=(\?|%3F)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=s.data.replace(jsre,"="+jsonp);s.url=s.url.replace(jsre,"="+jsonp);s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get")s.url+=(s.url.match(/\?/)?"&":"?")+"_="+(new Date()).getTime();if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if(!s.url.indexOf("http")&&s.dataType=="script"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(!jsonp&&(s.success||s.complete)){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async);if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
   21.31 -jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();return xml;function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
   21.32 -for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
   21.33 -s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock?this.oldblock:"";if(jQuery.css(this,"display")=="none")this.style.display="block";}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");if(this.oldblock=="none")this.oldblock="block";this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var opt=jQuery.speed(speed,easing,callback);return this[opt.queue===false?"each":"queue"](function(){opt=jQuery.extend({},opt);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
   21.34 -e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(){var timers=jQuery.timers;return this.each(function(){for(var i=0;i<timers.length;i++)if(timers[i].elem==this)timers.splice(i--,1);}).dequeue();}});var queue=function(elem,type,array){if(!elem)return;var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.curCSS(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.css(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(){return self.step();}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timers.length==1){var timer=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length)clearInterval(timer);},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(){var t=(new Date()).getTime();if(t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var absolute=jQuery.css(elem,"position")=="absolute",parent=elem.parentNode,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522;if(elem.getBoundingClientRect){box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));if(msie){var border=jQuery("html").css("borderWidth");border=(border=="medium"||jQuery.boxModel&&parseInt(version)>=7)&&2||border;add(-border,-border);}}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&/^t[d|h]$/i.test(parent.tagName)||!safari2)border(offsetParent);if(safari2&&!absolute&&jQuery.css(offsetParent,"position")=="absolute")absolute=true;offsetParent=offsetParent.offsetParent;}while(parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table-row.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if(safari2&&absolute)add(-doc.body.offsetLeft,-doc.body.offsetTop);}results={top:top,left:left};}return results;function border(elem){add(jQuery.css(elem,"borderLeftWidth"),jQuery.css(elem,"borderTopWidth"));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}};})();
   21.35 \ No newline at end of file
    22.1 --- a/web/javascript/jquery.js	Tue Oct 27 21:29:13 2009 -0700
    22.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    22.3 @@ -1,2992 +0,0 @@
    22.4 -(function(){
    22.5 -/*
    22.6 - * jQuery 1.2.1 - New Wave Javascript
    22.7 - *
    22.8 - * Copyright (c) 2007 John Resig (jquery.com)
    22.9 - * Dual licensed under the MIT (MIT-LICENSE.txt)
   22.10 - * and GPL (GPL-LICENSE.txt) licenses.
   22.11 - *
   22.12 - * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   22.13 - * $Rev: 3353 $
   22.14 - */
   22.15 -
   22.16 -// Map over jQuery in case of overwrite
   22.17 -if ( typeof jQuery != "undefined" )
   22.18 -	var _jQuery = jQuery;
   22.19 -
   22.20 -var jQuery = window.jQuery = function(selector, context) {
   22.21 -	// If the context is a namespace object, return a new object
   22.22 -	return this instanceof jQuery ?
   22.23 -		this.init(selector, context) :
   22.24 -		new jQuery(selector, context);
   22.25 -};
   22.26 -
   22.27 -// Map over the $ in case of overwrite
   22.28 -if ( typeof $ != "undefined" )
   22.29 -	var _$ = $;
   22.30 -	
   22.31 -// Map the jQuery namespace to the '$' one
   22.32 -window.$ = jQuery;
   22.33 -
   22.34 -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
   22.35 -
   22.36 -jQuery.fn = jQuery.prototype = {
   22.37 -	init: function(selector, context) {
   22.38 -		// Make sure that a selection was provided
   22.39 -		selector = selector || document;
   22.40 -
   22.41 -		// Handle HTML strings
   22.42 -		if ( typeof selector  == "string" ) {
   22.43 -			var m = quickExpr.exec(selector);
   22.44 -			if ( m && (m[1] || !context) ) {
   22.45 -				// HANDLE: $(html) -> $(array)
   22.46 -				if ( m[1] )
   22.47 -					selector = jQuery.clean( [ m[1] ], context );
   22.48 -
   22.49 -				// HANDLE: $("#id")
   22.50 -				else {
   22.51 -					var tmp = document.getElementById( m[3] );
   22.52 -					if ( tmp )
   22.53 -						// Handle the case where IE and Opera return items
   22.54 -						// by name instead of ID
   22.55 -						if ( tmp.id != m[3] )
   22.56 -							return jQuery().find( selector );
   22.57 -						else {
   22.58 -							this[0] = tmp;
   22.59 -							this.length = 1;
   22.60 -							return this;
   22.61 -						}
   22.62 -					else
   22.63 -						selector = [];
   22.64 -				}
   22.65 -
   22.66 -			// HANDLE: $(expr)
   22.67 -			} else
   22.68 -				return new jQuery( context ).find( selector );
   22.69 -
   22.70 -		// HANDLE: $(function)
   22.71 -		// Shortcut for document ready
   22.72 -		} else if ( jQuery.isFunction(selector) )
   22.73 -			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
   22.74 -
   22.75 -		return this.setArray(
   22.76 -			// HANDLE: $(array)
   22.77 -			selector.constructor == Array && selector ||
   22.78 -
   22.79 -			// HANDLE: $(arraylike)
   22.80 -			// Watch for when an array-like object is passed as the selector
   22.81 -			(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
   22.82 -
   22.83 -			// HANDLE: $(*)
   22.84 -			[ selector ] );
   22.85 -	},
   22.86 -	
   22.87 -	jquery: "1.2.1",
   22.88 -
   22.89 -	size: function() {
   22.90 -		return this.length;
   22.91 -	},
   22.92 -	
   22.93 -	length: 0,
   22.94 -
   22.95 -	get: function( num ) {
   22.96 -		return num == undefined ?
   22.97 -
   22.98 -			// Return a 'clean' array
   22.99 -			jQuery.makeArray( this ) :
  22.100 -
  22.101 -			// Return just the object
  22.102 -			this[num];
  22.103 -	},
  22.104 -	
  22.105 -	pushStack: function( a ) {
  22.106 -		var ret = jQuery(a);
  22.107 -		ret.prevObject = this;
  22.108 -		return ret;
  22.109 -	},
  22.110 -	
  22.111 -	setArray: function( a ) {
  22.112 -		this.length = 0;
  22.113 -		Array.prototype.push.apply( this, a );
  22.114 -		return this;
  22.115 -	},
  22.116 -
  22.117 -	each: function( fn, args ) {
  22.118 -		return jQuery.each( this, fn, args );
  22.119 -	},
  22.120 -
  22.121 -	index: function( obj ) {
  22.122 -		var pos = -1;
  22.123 -		this.each(function(i){
  22.124 -			if ( this == obj ) pos = i;
  22.125 -		});
  22.126 -		return pos;
  22.127 -	},
  22.128 -
  22.129 -	attr: function( key, value, type ) {
  22.130 -		var obj = key;
  22.131 -		
  22.132 -		// Look for the case where we're accessing a style value
  22.133 -		if ( key.constructor == String )
  22.134 -			if ( value == undefined )
  22.135 -				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
  22.136 -			else {
  22.137 -				obj = {};
  22.138 -				obj[ key ] = value;
  22.139 -			}
  22.140 -		
  22.141 -		// Check to see if we're setting style values
  22.142 -		return this.each(function(index){
  22.143 -			// Set all the styles
  22.144 -			for ( var prop in obj )
  22.145 -				jQuery.attr(
  22.146 -					type ? this.style : this,
  22.147 -					prop, jQuery.prop(this, obj[prop], type, index, prop)
  22.148 -				);
  22.149 -		});
  22.150 -	},
  22.151 -
  22.152 -	css: function( key, value ) {
  22.153 -		return this.attr( key, value, "curCSS" );
  22.154 -	},
  22.155 -
  22.156 -	text: function(e) {
  22.157 -		if ( typeof e != "object" && e != null )
  22.158 -			return this.empty().append( document.createTextNode( e ) );
  22.159 -
  22.160 -		var t = "";
  22.161 -		jQuery.each( e || this, function(){
  22.162 -			jQuery.each( this.childNodes, function(){
  22.163 -				if ( this.nodeType != 8 )
  22.164 -					t += this.nodeType != 1 ?
  22.165 -						this.nodeValue : jQuery.fn.text([ this ]);
  22.166 -			});
  22.167 -		});
  22.168 -		return t;
  22.169 -	},
  22.170 -
  22.171 -	wrapAll: function(html) {
  22.172 -		if ( this[0] )
  22.173 -			// The elements to wrap the target around
  22.174 -			jQuery(html, this[0].ownerDocument)
  22.175 -				.clone()
  22.176 -				.insertBefore(this[0])
  22.177 -				.map(function(){
  22.178 -					var elem = this;
  22.179 -					while ( elem.firstChild )
  22.180 -						elem = elem.firstChild;
  22.181 -					return elem;
  22.182 -				})
  22.183 -				.append(this);
  22.184 -
  22.185 -		return this;
  22.186 -	},
  22.187 -
  22.188 -	wrapInner: function(html) {
  22.189 -		return this.each(function(){
  22.190 -			jQuery(this).contents().wrapAll(html);
  22.191 -		});
  22.192 -	},
  22.193 -
  22.194 -	wrap: function(html) {
  22.195 -		return this.each(function(){
  22.196 -			jQuery(this).wrapAll(html);
  22.197 -		});
  22.198 -	},
  22.199 -
  22.200 -	append: function() {
  22.201 -		return this.domManip(arguments, true, 1, function(a){
  22.202 -			this.appendChild( a );
  22.203 -		});
  22.204 -	},
  22.205 -
  22.206 -	prepend: function() {
  22.207 -		return this.domManip(arguments, true, -1, function(a){
  22.208 -			this.insertBefore( a, this.firstChild );
  22.209 -		});
  22.210 -	},
  22.211 -	
  22.212 -	before: function() {
  22.213 -		return this.domManip(arguments, false, 1, function(a){
  22.214 -			this.parentNode.insertBefore( a, this );
  22.215 -		});
  22.216 -	},
  22.217 -
  22.218 -	after: function() {
  22.219 -		return this.domManip(arguments, false, -1, function(a){
  22.220 -			this.parentNode.insertBefore( a, this.nextSibling );
  22.221 -		});
  22.222 -	},
  22.223 -
  22.224 -	end: function() {
  22.225 -		return this.prevObject || jQuery([]);
  22.226 -	},
  22.227 -
  22.228 -	find: function(t) {
  22.229 -		var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
  22.230 -		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
  22.231 -			jQuery.unique( data ) : data );
  22.232 -	},
  22.233 -
  22.234 -	clone: function(events) {
  22.235 -		// Do the clone
  22.236 -		var ret = this.map(function(){
  22.237 -			return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
  22.238 -		});
  22.239 -
  22.240 -		// Need to set the expando to null on the cloned set if it exists
  22.241 -		// removeData doesn't work here, IE removes it from the original as well
  22.242 -		// this is primarily for IE but the data expando shouldn't be copied over in any browser
  22.243 -		var clone = ret.find("*").andSelf().each(function(){
  22.244 -			if ( this[ expando ] != undefined )
  22.245 -				this[ expando ] = null;
  22.246 -		});
  22.247 -		
  22.248 -		// Copy the events from the original to the clone
  22.249 -		if (events === true)
  22.250 -			this.find("*").andSelf().each(function(i) {
  22.251 -				var events = jQuery.data(this, "events");
  22.252 -				for ( var type in events )
  22.253 -					for ( var handler in events[type] )
  22.254 -						jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
  22.255 -			});
  22.256 -
  22.257 -		// Return the cloned set
  22.258 -		return ret;
  22.259 -	},
  22.260 -
  22.261 -	filter: function(t) {
  22.262 -		return this.pushStack(
  22.263 -			jQuery.isFunction( t ) &&
  22.264 -			jQuery.grep(this, function(el, index){
  22.265 -				return t.apply(el, [index]);
  22.266 -			}) ||
  22.267 -
  22.268 -			jQuery.multiFilter(t,this) );
  22.269 -	},
  22.270 -
  22.271 -	not: function(t) {
  22.272 -		return this.pushStack(
  22.273 -			t.constructor == String &&
  22.274 -			jQuery.multiFilter(t, this, true) ||
  22.275 -
  22.276 -			jQuery.grep(this, function(a) {
  22.277 -				return ( t.constructor == Array || t.jquery )
  22.278 -					? jQuery.inArray( a, t ) < 0
  22.279 -					: a != t;
  22.280 -			})
  22.281 -		);
  22.282 -	},
  22.283 -
  22.284 -	add: function(t) {
  22.285 -		return this.pushStack( jQuery.merge(
  22.286 -			this.get(),
  22.287 -			t.constructor == String ?
  22.288 -				jQuery(t).get() :
  22.289 -				t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
  22.290 -					t : [t] )
  22.291 -		);
  22.292 -	},
  22.293 -
  22.294 -	is: function(expr) {
  22.295 -		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
  22.296 -	},
  22.297 -
  22.298 -	hasClass: function(expr) {
  22.299 -		return this.is("." + expr);
  22.300 -	},
  22.301 -	
  22.302 -	val: function( val ) {
  22.303 -		if ( val == undefined ) {
  22.304 -			if ( this.length ) {
  22.305 -				var elem = this[0];
  22.306 -		    	
  22.307 -				// We need to handle select boxes special
  22.308 -				if ( jQuery.nodeName(elem, "select") ) {
  22.309 -					var index = elem.selectedIndex,
  22.310 -						a = [],
  22.311 -						options = elem.options,
  22.312 -						one = elem.type == "select-one";
  22.313 -					
  22.314 -					// Nothing was selected
  22.315 -					if ( index < 0 )
  22.316 -						return null;
  22.317 -
  22.318 -					// Loop through all the selected options
  22.319 -					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  22.320 -						var option = options[i];
  22.321 -						if ( option.selected ) {
  22.322 -							// Get the specifc value for the option
  22.323 -							var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
  22.324 -							
  22.325 -							// We don't need an array for one selects
  22.326 -							if ( one )
  22.327 -								return val;
  22.328 -							
  22.329 -							// Multi-Selects return an array
  22.330 -							a.push(val);
  22.331 -						}
  22.332 -					}
  22.333 -					
  22.334 -					return a;
  22.335 -					
  22.336 -				// Everything else, we just grab the value
  22.337 -				} else
  22.338 -					return this[0].value.replace(/\r/g, "");
  22.339 -			}
  22.340 -		} else
  22.341 -			return this.each(function(){
  22.342 -				if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
  22.343 -					this.checked = (jQuery.inArray(this.value, val) >= 0 ||
  22.344 -						jQuery.inArray(this.name, val) >= 0);
  22.345 -				else if ( jQuery.nodeName(this, "select") ) {
  22.346 -					var tmp = val.constructor == Array ? val : [val];
  22.347 -
  22.348 -					jQuery("option", this).each(function(){
  22.349 -						this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
  22.350 -						jQuery.inArray(this.text, tmp) >= 0);
  22.351 -					});
  22.352 -
  22.353 -					if ( !tmp.length )
  22.354 -						this.selectedIndex = -1;
  22.355 -				} else
  22.356 -					this.value = val;
  22.357 -			});
  22.358 -	},
  22.359 -	
  22.360 -	html: function( val ) {
  22.361 -		return val == undefined ?
  22.362 -			( this.length ? this[0].innerHTML : null ) :
  22.363 -			this.empty().append( val );
  22.364 -	},
  22.365 -
  22.366 -	replaceWith: function( val ) {
  22.367 -		return this.after( val ).remove();
  22.368 -	},
  22.369 -
  22.370 -	eq: function(i){
  22.371 -		return this.slice(i, i+1);
  22.372 -	},
  22.373 -
  22.374 -	slice: function() {
  22.375 -		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
  22.376 -	},
  22.377 -
  22.378 -	map: function(fn) {
  22.379 -		return this.pushStack(jQuery.map( this, function(elem,i){
  22.380 -			return fn.call( elem, i, elem );
  22.381 -		}));
  22.382 -	},
  22.383 -
  22.384 -	andSelf: function() {
  22.385 -		return this.add( this.prevObject );
  22.386 -	},
  22.387 -	
  22.388 -	domManip: function(args, table, dir, fn) {
  22.389 -		var clone = this.length > 1, a; 
  22.390 -
  22.391 -		return this.each(function(){
  22.392 -			if ( !a ) {
  22.393 -				a = jQuery.clean(args, this.ownerDocument);
  22.394 -				if ( dir < 0 )
  22.395 -					a.reverse();
  22.396 -			}
  22.397 -
  22.398 -			var obj = this;
  22.399 -
  22.400 -			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
  22.401 -				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
  22.402 -
  22.403 -			jQuery.each( a, function(){
  22.404 -				var elem = clone ? this.cloneNode(true) : this;
  22.405 -				if ( !evalScript(0, elem) )
  22.406 -					fn.call( obj, elem );
  22.407 -			});
  22.408 -		});
  22.409 -	}
  22.410 -};
  22.411 -
  22.412 -function evalScript(i, elem){
  22.413 -	var script = jQuery.nodeName(elem, "script");
  22.414 -
  22.415 -	if ( script ) {
  22.416 -		if ( elem.src )
  22.417 -			jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
  22.418 -		else
  22.419 -			jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  22.420 -	
  22.421 -		if ( elem.parentNode )
  22.422 -			elem.parentNode.removeChild(elem);
  22.423 -
  22.424 -	} else if ( elem.nodeType == 1 )
  22.425 -    jQuery("script", elem).each(evalScript);
  22.426 -
  22.427 -	return script;
  22.428 -}
  22.429 -
  22.430 -jQuery.extend = jQuery.fn.extend = function() {
  22.431 -	// copy reference to target object
  22.432 -	var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
  22.433 -
  22.434 -	// Handle a deep copy situation
  22.435 -	if ( target.constructor == Boolean ) {
  22.436 -		deep = target;
  22.437 -		target = arguments[1] || {};
  22.438 -	}
  22.439 -
  22.440 -	// extend jQuery itself if only one argument is passed
  22.441 -	if ( al == 1 ) {
  22.442 -		target = this;
  22.443 -		a = 0;
  22.444 -	}
  22.445 -
  22.446 -	var prop;
  22.447 -
  22.448 -	for ( ; a < al; a++ )
  22.449 -		// Only deal with non-null/undefined values
  22.450 -		if ( (prop = arguments[a]) != null )
  22.451 -			// Extend the base object
  22.452 -			for ( var i in prop ) {
  22.453 -				// Prevent never-ending loop
  22.454 -				if ( target == prop[i] )
  22.455 -					continue;
  22.456 -
  22.457 -				// Recurse if we're merging object values
  22.458 -				if ( deep && typeof prop[i] == 'object' && target[i] )
  22.459 -					jQuery.extend( target[i], prop[i] );
  22.460 -
  22.461 -				// Don't bring in undefined values
  22.462 -				else if ( prop[i] != undefined )
  22.463 -					target[i] = prop[i];
  22.464 -			}
  22.465 -
  22.466 -	// Return the modified object
  22.467 -	return target;
  22.468 -};
  22.469 -
  22.470 -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
  22.471 -
  22.472 -jQuery.extend({
  22.473 -	noConflict: function(deep) {
  22.474 -		window.$ = _$;
  22.475 -		if ( deep )
  22.476 -			window.jQuery = _jQuery;
  22.477 -		return jQuery;
  22.478 -	},
  22.479 -
  22.480 -	// This may seem like some crazy code, but trust me when I say that this
  22.481 -	// is the only cross-browser way to do this. --John
  22.482 -	isFunction: function( fn ) {
  22.483 -		return !!fn && typeof fn != "string" && !fn.nodeName && 
  22.484 -			fn.constructor != Array && /function/i.test( fn + "" );
  22.485 -	},
  22.486 -	
  22.487 -	// check if an element is in a XML document
  22.488 -	isXMLDoc: function(elem) {
  22.489 -		return elem.documentElement && !elem.body ||
  22.490 -			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
  22.491 -	},
  22.492 -
  22.493 -	// Evalulates a script in a global context
  22.494 -	// Evaluates Async. in Safari 2 :-(
  22.495 -	globalEval: function( data ) {
  22.496 -		data = jQuery.trim( data );
  22.497 -		if ( data ) {
  22.498 -			if ( window.execScript )
  22.499 -				window.execScript( data );
  22.500 -			else if ( jQuery.browser.safari )
  22.501 -				// safari doesn't provide a synchronous global eval
  22.502 -				window.setTimeout( data, 0 );
  22.503 -			else
  22.504 -				eval.call( window, data );
  22.505 -		}
  22.506 -	},
  22.507 -
  22.508 -	nodeName: function( elem, name ) {
  22.509 -		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  22.510 -	},
  22.511 -	
  22.512 -	cache: {},
  22.513 -	
  22.514 -	data: function( elem, name, data ) {
  22.515 -		elem = elem == window ? win : elem;
  22.516 -
  22.517 -		var id = elem[ expando ];
  22.518 -
  22.519 -		// Compute a unique ID for the element
  22.520 -		if ( !id ) 
  22.521 -			id = elem[ expando ] = ++uuid;
  22.522 -
  22.523 -		// Only generate the data cache if we're
  22.524 -		// trying to access or manipulate it
  22.525 -		if ( name && !jQuery.cache[ id ] )
  22.526 -			jQuery.cache[ id ] = {};
  22.527 -		
  22.528 -		// Prevent overriding the named cache with undefined values
  22.529 -		if ( data != undefined )
  22.530 -			jQuery.cache[ id ][ name ] = data;
  22.531 -		
  22.532 -		// Return the named cache data, or the ID for the element	
  22.533 -		return name ? jQuery.cache[ id ][ name ] : id;
  22.534 -	},
  22.535 -	
  22.536 -	removeData: function( elem, name ) {
  22.537 -		elem = elem == window ? win : elem;
  22.538 -
  22.539 -		var id = elem[ expando ];
  22.540 -
  22.541 -		// If we want to remove a specific section of the element's data
  22.542 -		if ( name ) {
  22.543 -			if ( jQuery.cache[ id ] ) {
  22.544 -				// Remove the section of cache data
  22.545 -				delete jQuery.cache[ id ][ name ];
  22.546 -
  22.547 -				// If we've removed all the data, remove the element's cache
  22.548 -				name = "";
  22.549 -				for ( name in jQuery.cache[ id ] ) break;
  22.550 -				if ( !name )
  22.551 -					jQuery.removeData( elem );
  22.552 -			}
  22.553 -
  22.554 -		// Otherwise, we want to remove all of the element's data
  22.555 -		} else {
  22.556 -			// Clean up the element expando
  22.557 -			try {
  22.558 -				delete elem[ expando ];
  22.559 -			} catch(e){
  22.560 -				// IE has trouble directly removing the expando
  22.561 -				// but it's ok with using removeAttribute
  22.562 -				if ( elem.removeAttribute )
  22.563 -					elem.removeAttribute( expando );
  22.564 -			}
  22.565 -
  22.566 -			// Completely remove the data cache
  22.567 -			delete jQuery.cache[ id ];
  22.568 -		}
  22.569 -	},
  22.570 -
  22.571 -	// args is for internal usage only
  22.572 -	each: function( obj, fn, args ) {
  22.573 -		if ( args ) {
  22.574 -			if ( obj.length == undefined )
  22.575 -				for ( var i in obj )
  22.576 -					fn.apply( obj[i], args );
  22.577 -			else
  22.578 -				for ( var i = 0, ol = obj.length; i < ol; i++ )
  22.579 -					if ( fn.apply( obj[i], args ) === false ) break;
  22.580 -
  22.581 -		// A special, fast, case for the most common use of each
  22.582 -		} else {
  22.583 -			if ( obj.length == undefined )
  22.584 -				for ( var i in obj )
  22.585 -					fn.call( obj[i], i, obj[i] );
  22.586 -			else
  22.587 -				for ( var i = 0, ol = obj.length, val = obj[0]; 
  22.588 -					i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
  22.589 -		}
  22.590 -
  22.591 -		return obj;
  22.592 -	},
  22.593 -	
  22.594 -	prop: function(elem, value, type, index, prop){
  22.595 -			// Handle executable functions
  22.596 -			if ( jQuery.isFunction( value ) )
  22.597 -				value = value.call( elem, [index] );
  22.598 -				
  22.599 -			// exclude the following css properties to add px
  22.600 -			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
  22.601 -
  22.602 -			// Handle passing in a number to a CSS property
  22.603 -			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
  22.604 -				value + "px" :
  22.605 -				value;
  22.606 -	},
  22.607 -
  22.608 -	className: {
  22.609 -		// internal only, use addClass("class")
  22.610 -		add: function( elem, c ){
  22.611 -			jQuery.each( (c || "").split(/\s+/), function(i, cur){
  22.612 -				if ( !jQuery.className.has( elem.className, cur ) )
  22.613 -					elem.className += ( elem.className ? " " : "" ) + cur;
  22.614 -			});
  22.615 -		},
  22.616 -
  22.617 -		// internal only, use removeClass("class")
  22.618 -		remove: function( elem, c ){
  22.619 -			elem.className = c != undefined ?
  22.620 -				jQuery.grep( elem.className.split(/\s+/), function(cur){
  22.621 -					return !jQuery.className.has( c, cur );	
  22.622 -				}).join(" ") : "";
  22.623 -		},
  22.624 -
  22.625 -		// internal only, use is(".class")
  22.626 -		has: function( t, c ) {
  22.627 -			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
  22.628 -		}
  22.629 -	},
  22.630 -
  22.631 -	swap: function(e,o,f) {
  22.632 -		for ( var i in o ) {
  22.633 -			e.style["old"+i] = e.style[i];
  22.634 -			e.style[i] = o[i];
  22.635 -		}
  22.636 -		f.apply( e, [] );
  22.637 -		for ( var i in o )
  22.638 -			e.style[i] = e.style["old"+i];
  22.639 -	},
  22.640 -
  22.641 -	css: function(e,p) {
  22.642 -		if ( p == "height" || p == "width" ) {
  22.643 -			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
  22.644 -
  22.645 -			jQuery.each( d, function(){
  22.646 -				old["padding" + this] = 0;
  22.647 -				old["border" + this + "Width"] = 0;
  22.648 -			});
  22.649 -
  22.650 -			jQuery.swap( e, old, function() {
  22.651 -				if ( jQuery(e).is(':visible') ) {
  22.652 -					oHeight = e.offsetHeight;
  22.653 -					oWidth = e.offsetWidth;
  22.654 -				} else {
  22.655 -					e = jQuery(e.cloneNode(true))
  22.656 -						.find(":radio").removeAttr("checked").end()
  22.657 -						.css({
  22.658 -							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
  22.659 -						}).appendTo(e.parentNode)[0];
  22.660 -
  22.661 -					var parPos = jQuery.css(e.parentNode,"position") || "static";
  22.662 -					if ( parPos == "static" )
  22.663 -						e.parentNode.style.position = "relative";
  22.664 -
  22.665 -					oHeight = e.clientHeight;
  22.666 -					oWidth = e.clientWidth;
  22.667 -
  22.668 -					if ( parPos == "static" )
  22.669 -						e.parentNode.style.position = "static";
  22.670 -
  22.671 -					e.parentNode.removeChild(e);
  22.672 -				}
  22.673 -			});
  22.674 -
  22.675 -			return p == "height" ? oHeight : oWidth;
  22.676 -		}
  22.677 -
  22.678 -		return jQuery.curCSS( e, p );
  22.679 -	},
  22.680 -
  22.681 -	curCSS: function(elem, prop, force) {
  22.682 -		var ret, stack = [], swap = [];
  22.683 -
  22.684 -		// A helper method for determining if an element's values are broken
  22.685 -		function color(a){
  22.686 -			if ( !jQuery.browser.safari )
  22.687 -				return false;
  22.688 -
  22.689 -			var ret = document.defaultView.getComputedStyle(a,null);
  22.690 -			return !ret || ret.getPropertyValue("color") == "";
  22.691 -		}
  22.692 -
  22.693 -		if (prop == "opacity" && jQuery.browser.msie) {
  22.694 -			ret = jQuery.attr(elem.style, "opacity");
  22.695 -			return ret == "" ? "1" : ret;
  22.696 -		}
  22.697 -		
  22.698 -		if (prop.match(/float/i))
  22.699 -			prop = styleFloat;
  22.700 -
  22.701 -		if (!force && elem.style[prop])
  22.702 -			ret = elem.style[prop];
  22.703 -
  22.704 -		else if (document.defaultView && document.defaultView.getComputedStyle) {
  22.705 -
  22.706 -			if (prop.match(/float/i))
  22.707 -				prop = "float";
  22.708 -
  22.709 -			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
  22.710 -			var cur = document.defaultView.getComputedStyle(elem, null);
  22.711 -
  22.712 -			if ( cur && !color(elem) )
  22.713 -				ret = cur.getPropertyValue(prop);
  22.714 -
  22.715 -			// If the element isn't reporting its values properly in Safari
  22.716 -			// then some display: none elements are involved
  22.717 -			else {
  22.718 -				// Locate all of the parent display: none elements
  22.719 -				for ( var a = elem; a && color(a); a = a.parentNode )
  22.720 -					stack.unshift(a);
  22.721 -
  22.722 -				// Go through and make them visible, but in reverse
  22.723 -				// (It would be better if we knew the exact display type that they had)
  22.724 -				for ( a = 0; a < stack.length; a++ )
  22.725 -					if ( color(stack[a]) ) {
  22.726 -						swap[a] = stack[a].style.display;
  22.727 -						stack[a].style.display = "block";
  22.728 -					}
  22.729 -
  22.730 -				// Since we flip the display style, we have to handle that
  22.731 -				// one special, otherwise get the value
  22.732 -				ret = prop == "display" && swap[stack.length-1] != null ?
  22.733 -					"none" :
  22.734 -					document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
  22.735 -
  22.736 -				// Finally, revert the display styles back
  22.737 -				for ( a = 0; a < swap.length; a++ )
  22.738 -					if ( swap[a] != null )
  22.739 -						stack[a].style.display = swap[a];
  22.740 -			}
  22.741 -
  22.742 -			if ( prop == "opacity" && ret == "" )
  22.743 -				ret = "1";
  22.744 -
  22.745 -		} else if (elem.currentStyle) {
  22.746 -			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
  22.747 -			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
  22.748 -
  22.749 -			// From the awesome hack by Dean Edwards
  22.750 -			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  22.751 -
  22.752 -			// If we're not dealing with a regular pixel number
  22.753 -			// but a number that has a weird ending, we need to convert it to pixels
  22.754 -			if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
  22.755 -				var style = elem.style.left;
  22.756 -				var runtimeStyle = elem.runtimeStyle.left;
  22.757 -				elem.runtimeStyle.left = elem.currentStyle.left;
  22.758 -				elem.style.left = ret || 0;
  22.759 -				ret = elem.style.pixelLeft + "px";
  22.760 -				elem.style.left = style;
  22.761 -				elem.runtimeStyle.left = runtimeStyle;
  22.762 -			}
  22.763 -		}
  22.764 -
  22.765 -		return ret;
  22.766 -	},
  22.767 -	
  22.768 -	clean: function(a, doc) {
  22.769 -		var r = [];
  22.770 -		doc = doc || document;
  22.771 -
  22.772 -		jQuery.each( a, function(i,arg){
  22.773 -			if ( !arg ) return;
  22.774 -
  22.775 -			if ( arg.constructor == Number )
  22.776 -				arg = arg.toString();
  22.777 -			
  22.778 -			// Convert html string into DOM nodes
  22.779 -			if ( typeof arg == "string" ) {
  22.780 -				// Fix "XHTML"-style tags in all browsers
  22.781 -				arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
  22.782 -					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
  22.783 -				});
  22.784 -
  22.785 -				// Trim whitespace, otherwise indexOf won't work as expected
  22.786 -				var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
  22.787 -
  22.788 -				var wrap =
  22.789 -					// option or optgroup
  22.790 -					!s.indexOf("<opt") &&
  22.791 -					[1, "<select>", "</select>"] ||
  22.792 -					
  22.793 -					!s.indexOf("<leg") &&
  22.794 -					[1, "<fieldset>", "</fieldset>"] ||
  22.795 -					
  22.796 -					s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  22.797 -					[1, "<table>", "</table>"] ||
  22.798 -					
  22.799 -					!s.indexOf("<tr") &&
  22.800 -					[2, "<table><tbody>", "</tbody></table>"] ||
  22.801 -					
  22.802 -				 	// <thead> matched above
  22.803 -					(!s.indexOf("<td") || !s.indexOf("<th")) &&
  22.804 -					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
  22.805 -					
  22.806 -					!s.indexOf("<col") &&
  22.807 -					[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
  22.808 -
  22.809 -					// IE can't serialize <link> and <script> tags normally
  22.810 -					jQuery.browser.msie &&
  22.811 -					[1, "div<div>", "</div>"] ||
  22.812 -					
  22.813 -					[0,"",""];
  22.814 -
  22.815 -				// Go to html and back, then peel off extra wrappers
  22.816 -				div.innerHTML = wrap[1] + arg + wrap[2];
  22.817 -				
  22.818 -				// Move to the right depth
  22.819 -				while ( wrap[0]-- )
  22.820 -					div = div.lastChild;
  22.821 -				
  22.822 -				// Remove IE's autoinserted <tbody> from table fragments
  22.823 -				if ( jQuery.browser.msie ) {
  22.824 -					
  22.825 -					// String was a <table>, *may* have spurious <tbody>
  22.826 -					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
  22.827 -						tb = div.firstChild && div.firstChild.childNodes;
  22.828 -						
  22.829 -					// String was a bare <thead> or <tfoot>
  22.830 -					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
  22.831 -						tb = div.childNodes;
  22.832 -
  22.833 -					for ( var n = tb.length-1; n >= 0 ; --n )
  22.834 -						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
  22.835 -							tb[n].parentNode.removeChild(tb[n]);
  22.836 -	
  22.837 -					// IE completely kills leading whitespace when innerHTML is used	
  22.838 -					if ( /^\s/.test(arg) )	
  22.839 -						div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
  22.840 -
  22.841 -				}
  22.842 -				
  22.843 -				arg = jQuery.makeArray( div.childNodes );
  22.844 -			}
  22.845 -
  22.846 -			if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
  22.847 -				return;
  22.848 -
  22.849 -			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
  22.850 -				r.push( arg );
  22.851 -			else
  22.852 -				r = jQuery.merge( r, arg );
  22.853 -
  22.854 -		});
  22.855 -
  22.856 -		return r;
  22.857 -	},
  22.858 -	
  22.859 -	attr: function(elem, name, value){
  22.860 -		var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
  22.861 -
  22.862 -		// Safari mis-reports the default selected property of a hidden option
  22.863 -		// Accessing the parent's selectedIndex property fixes it
  22.864 -		if ( name == "selected" && jQuery.browser.safari )
  22.865 -			elem.parentNode.selectedIndex;
  22.866 -		
  22.867 -		// Certain attributes only work when accessed via the old DOM 0 way
  22.868 -		if ( fix[name] ) {
  22.869 -			if ( value != undefined ) elem[fix[name]] = value;
  22.870 -			return elem[fix[name]];
  22.871 -		} else if ( jQuery.browser.msie && name == "style" )
  22.872 -			return jQuery.attr( elem.style, "cssText", value );
  22.873 -
  22.874 -		else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
  22.875 -			return elem.getAttributeNode(name).nodeValue;
  22.876 -
  22.877 -		// IE elem.getAttribute passes even for style
  22.878 -		else if ( elem.tagName ) {
  22.879 -
  22.880 -			if ( value != undefined ) {
  22.881 -				if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
  22.882 -					throw "type property can't be changed";
  22.883 -				elem.setAttribute( name, value );
  22.884 -			}
  22.885 -
  22.886 -			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
  22.887 -				return elem.getAttribute( name, 2 );
  22.888 -
  22.889 -			return elem.getAttribute( name );
  22.890 -
  22.891 -		// elem is actually elem.style ... set the style
  22.892 -		} else {
  22.893 -			// IE actually uses filters for opacity
  22.894 -			if ( name == "opacity" && jQuery.browser.msie ) {
  22.895 -				if ( value != undefined ) {
  22.896 -					// IE has trouble with opacity if it does not have layout
  22.897 -					// Force it by setting the zoom level
  22.898 -					elem.zoom = 1; 
  22.899 -	
  22.900 -					// Set the alpha filter to set the opacity
  22.901 -					elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
  22.902 -						(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  22.903 -				}
  22.904 -	
  22.905 -				return elem.filter ? 
  22.906 -					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
  22.907 -			}
  22.908 -			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
  22.909 -			if ( value != undefined ) elem[name] = value;
  22.910 -			return elem[name];
  22.911 -		}
  22.912 -	},
  22.913 -	
  22.914 -	trim: function(t){
  22.915 -		return (t||"").replace(/^\s+|\s+$/g, "");
  22.916 -	},
  22.917 -
  22.918 -	makeArray: function( a ) {
  22.919 -		var r = [];
  22.920 -
  22.921 -		// Need to use typeof to fight Safari childNodes crashes
  22.922 -		if ( typeof a != "array" )
  22.923 -			for ( var i = 0, al = a.length; i < al; i++ )
  22.924 -				r.push( a[i] );
  22.925 -		else
  22.926 -			r = a.slice( 0 );
  22.927 -
  22.928 -		return r;
  22.929 -	},
  22.930 -
  22.931 -	inArray: function( b, a ) {
  22.932 -		for ( var i = 0, al = a.length; i < al; i++ )
  22.933 -			if ( a[i] == b )
  22.934 -				return i;
  22.935 -		return -1;
  22.936 -	},
  22.937 -
  22.938 -	merge: function(first, second) {
  22.939 -		// We have to loop this way because IE & Opera overwrite the length
  22.940 -		// expando of getElementsByTagName
  22.941 -
  22.942 -		// Also, we need to make sure that the correct elements are being returned
  22.943 -		// (IE returns comment nodes in a '*' query)
  22.944 -		if ( jQuery.browser.msie ) {
  22.945 -			for ( var i = 0; second[i]; i++ )
  22.946 -				if ( second[i].nodeType != 8 )
  22.947 -					first.push(second[i]);
  22.948 -		} else
  22.949 -			for ( var i = 0; second[i]; i++ )
  22.950 -				first.push(second[i]);
  22.951 -
  22.952 -		return first;
  22.953 -	},
  22.954 -
  22.955 -	unique: function(first) {
  22.956 -		var r = [], done = {};
  22.957 -
  22.958 -		try {
  22.959 -			for ( var i = 0, fl = first.length; i < fl; i++ ) {
  22.960 -				var id = jQuery.data(first[i]);
  22.961 -				if ( !done[id] ) {
  22.962 -					done[id] = true;
  22.963 -					r.push(first[i]);
  22.964 -				}
  22.965 -			}
  22.966 -		} catch(e) {
  22.967 -			r = first;
  22.968 -		}
  22.969 -
  22.970 -		return r;
  22.971 -	},
  22.972 -
  22.973 -	grep: function(elems, fn, inv) {
  22.974 -		// If a string is passed in for the function, make a function
  22.975 -		// for it (a handy shortcut)
  22.976 -		if ( typeof fn == "string" )
  22.977 -			fn = eval("false||function(a,i){return " + fn + "}");
  22.978 -
  22.979 -		var result = [];
  22.980 -
  22.981 -		// Go through the array, only saving the items
  22.982 -		// that pass the validator function
  22.983 -		for ( var i = 0, el = elems.length; i < el; i++ )
  22.984 -			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
  22.985 -				result.push( elems[i] );
  22.986 -
  22.987 -		return result;
  22.988 -	},
  22.989 -
  22.990 -	map: function(elems, fn) {
  22.991 -		// If a string is passed in for the function, make a function
  22.992 -		// for it (a handy shortcut)
  22.993 -		if ( typeof fn == "string" )
  22.994 -			fn = eval("false||function(a){return " + fn + "}");
  22.995 -
  22.996 -		var result = [];
  22.997 -
  22.998 -		// Go through the array, translating each of the items to their
  22.999 -		// new value (or values).
 22.1000 -		for ( var i = 0, el = elems.length; i < el; i++ ) {
 22.1001 -			var val = fn(elems[i],i);
 22.1002 -
 22.1003 -			if ( val !== null && val != undefined ) {
 22.1004 -				if ( val.constructor != Array ) val = [val];
 22.1005 -				result = result.concat( val );
 22.1006 -			}
 22.1007 -		}
 22.1008 -
 22.1009 -		return result;
 22.1010 -	}
 22.1011 -});
 22.1012 -
 22.1013 -var userAgent = navigator.userAgent.toLowerCase();
 22.1014 -
 22.1015 -// Figure out what browser is being used
 22.1016 -jQuery.browser = {
 22.1017 -	version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
 22.1018 -	safari: /webkit/.test(userAgent),
 22.1019 -	opera: /opera/.test(userAgent),
 22.1020 -	msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
 22.1021 -	mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
 22.1022 -};
 22.1023 -
 22.1024 -var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 22.1025 -	
 22.1026 -jQuery.extend({
 22.1027 -	// Check to see if the W3C box model is being used
 22.1028 -	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 22.1029 -	
 22.1030 -	styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
 22.1031 -	
 22.1032 -	props: {
 22.1033 -		"for": "htmlFor",
 22.1034 -		"class": "className",
 22.1035 -		"float": styleFloat,
 22.1036 -		cssFloat: styleFloat,
 22.1037 -		styleFloat: styleFloat,
 22.1038 -		innerHTML: "innerHTML",
 22.1039 -		className: "className",
 22.1040 -		value: "value",
 22.1041 -		disabled: "disabled",
 22.1042 -		checked: "checked",
 22.1043 -		readonly: "readOnly",
 22.1044 -		selected: "selected",
 22.1045 -		maxlength: "maxLength"
 22.1046 -	}
 22.1047 -});
 22.1048 -
 22.1049 -jQuery.each({
 22.1050 -	parent: "a.parentNode",
 22.1051 -	parents: "jQuery.dir(a,'parentNode')",
 22.1052 -	next: "jQuery.nth(a,2,'nextSibling')",
 22.1053 -	prev: "jQuery.nth(a,2,'previousSibling')",
 22.1054 -	nextAll: "jQuery.dir(a,'nextSibling')",
 22.1055 -	prevAll: "jQuery.dir(a,'previousSibling')",
 22.1056 -	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
 22.1057 -	children: "jQuery.sibling(a.firstChild)",
 22.1058 -	contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
 22.1059 -}, function(i,n){
 22.1060 -	jQuery.fn[ i ] = function(a) {
 22.1061 -		var ret = jQuery.map(this,n);
 22.1062 -		if ( a && typeof a == "string" )
 22.1063 -			ret = jQuery.multiFilter(a,ret);
 22.1064 -		return this.pushStack( jQuery.unique(ret) );
 22.1065 -	};
 22.1066 -});
 22.1067 -
 22.1068 -jQuery.each({
 22.1069 -	appendTo: "append",
 22.1070 -	prependTo: "prepend",
 22.1071 -	insertBefore: "before",
 22.1072 -	insertAfter: "after",
 22.1073 -	replaceAll: "replaceWith"
 22.1074 -}, function(i,n){
 22.1075 -	jQuery.fn[ i ] = function(){
 22.1076 -		var a = arguments;
 22.1077 -		return this.each(function(){
 22.1078 -			for ( var j = 0, al = a.length; j < al; j++ )
 22.1079 -				jQuery(a[j])[n]( this );
 22.1080 -		});
 22.1081 -	};
 22.1082 -});
 22.1083 -
 22.1084 -jQuery.each( {
 22.1085 -	removeAttr: function( key ) {
 22.1086 -		jQuery.attr( this, key, "" );
 22.1087 -		this.removeAttribute( key );
 22.1088 -	},
 22.1089 -	addClass: function(c){
 22.1090 -		jQuery.className.add(this,c);
 22.1091 -	},
 22.1092 -	removeClass: function(c){
 22.1093 -		jQuery.className.remove(this,c);
 22.1094 -	},
 22.1095 -	toggleClass: function( c ){
 22.1096 -		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
 22.1097 -	},
 22.1098 -	remove: function(a){
 22.1099 -		if ( !a || jQuery.filter( a, [this] ).r.length ) {
 22.1100 -			jQuery.removeData( this );
 22.1101 -			this.parentNode.removeChild( this );
 22.1102 -		}
 22.1103 -	},
 22.1104 -	empty: function() {
 22.1105 -		// Clean up the cache
 22.1106 -		jQuery("*", this).each(function(){ jQuery.removeData(this); });
 22.1107 -
 22.1108 -		while ( this.firstChild )
 22.1109 -			this.removeChild( this.firstChild );
 22.1110 -	}
 22.1111 -}, function(i,n){
 22.1112 -	jQuery.fn[ i ] = function() {
 22.1113 -		return this.each( n, arguments );
 22.1114 -	};
 22.1115 -});
 22.1116 -
 22.1117 -jQuery.each( [ "Height", "Width" ], function(i,name){
 22.1118 -	var n = name.toLowerCase();
 22.1119 -	
 22.1120 -	jQuery.fn[ n ] = function(h) {
 22.1121 -		return this[0] == window ?
 22.1122 -			jQuery.browser.safari && self["inner" + name] ||
 22.1123 -			jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
 22.1124 -			document.body["client" + name] :
 22.1125 -		
 22.1126 -			this[0] == document ?
 22.1127 -				Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
 22.1128 -        
 22.1129 -				h == undefined ?
 22.1130 -					( this.length ? jQuery.css( this[0], n ) : null ) :
 22.1131 -					this.css( n, h.constructor == String ? h : h + "px" );
 22.1132 -	};
 22.1133 -});
 22.1134 -
 22.1135 -var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
 22.1136 -		"(?:[\\w*_-]|\\\\.)" :
 22.1137 -		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
 22.1138 -	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
 22.1139 -	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
 22.1140 -	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
 22.1141 -
 22.1142 -jQuery.extend({
 22.1143 -	expr: {
 22.1144 -		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
 22.1145 -		"#": "a.getAttribute('id')==m[2]",
 22.1146 -		":": {
 22.1147 -			// Position Checks
 22.1148 -			lt: "i<m[3]-0",
 22.1149 -			gt: "i>m[3]-0",
 22.1150 -			nth: "m[3]-0==i",
 22.1151 -			eq: "m[3]-0==i",
 22.1152 -			first: "i==0",
 22.1153 -			last: "i==r.length-1",
 22.1154 -			even: "i%2==0",
 22.1155 -			odd: "i%2",
 22.1156 -
 22.1157 -			// Child Checks
 22.1158 -			"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
 22.1159 -			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
 22.1160 -			"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
 22.1161 -
 22.1162 -			// Parent Checks
 22.1163 -			parent: "a.firstChild",
 22.1164 -			empty: "!a.firstChild",
 22.1165 -
 22.1166 -			// Text Check
 22.1167 -			contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
 22.1168 -
 22.1169 -			// Visibility
 22.1170 -			visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
 22.1171 -			hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
 22.1172 -
 22.1173 -			// Form attributes
 22.1174 -			enabled: "!a.disabled",
 22.1175 -			disabled: "a.disabled",
 22.1176 -			checked: "a.checked",
 22.1177 -			selected: "a.selected||jQuery.attr(a,'selected')",
 22.1178 -
 22.1179 -			// Form elements
 22.1180 -			text: "'text'==a.type",
 22.1181 -			radio: "'radio'==a.type",
 22.1182 -			checkbox: "'checkbox'==a.type",
 22.1183 -			file: "'file'==a.type",
 22.1184 -			password: "'password'==a.type",
 22.1185 -			submit: "'submit'==a.type",
 22.1186 -			image: "'image'==a.type",
 22.1187 -			reset: "'reset'==a.type",
 22.1188 -			button: '"button"==a.type||jQuery.nodeName(a,"button")',
 22.1189 -			input: "/input|select|textarea|button/i.test(a.nodeName)",
 22.1190 -
 22.1191 -			// :has()
 22.1192 -			has: "jQuery.find(m[3],a).length",
 22.1193 -
 22.1194 -			// :header
 22.1195 -			header: "/h\\d/i.test(a.nodeName)",
 22.1196 -
 22.1197 -			// :animated
 22.1198 -			animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
 22.1199 -		}
 22.1200 -	},
 22.1201 -	
 22.1202 -	// The regular expressions that power the parsing engine
 22.1203 -	parse: [
 22.1204 -		// Match: [@value='test'], [@foo]
 22.1205 -		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 22.1206 -
 22.1207 -		// Match: :contains('foo')
 22.1208 -		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 22.1209 -
 22.1210 -		// Match: :even, :last-chlid, #id, .class
 22.1211 -		new RegExp("^([:.#]*)(" + chars + "+)")
 22.1212 -	],
 22.1213 -
 22.1214 -	multiFilter: function( expr, elems, not ) {
 22.1215 -		var old, cur = [];
 22.1216 -
 22.1217 -		while ( expr && expr != old ) {
 22.1218 -			old = expr;
 22.1219 -			var f = jQuery.filter( expr, elems, not );
 22.1220 -			expr = f.t.replace(/^\s*,\s*/, "" );
 22.1221 -			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
 22.1222 -		}
 22.1223 -
 22.1224 -		return cur;
 22.1225 -	},
 22.1226 -
 22.1227 -	find: function( t, context ) {
 22.1228 -		// Quickly handle non-string expressions
 22.1229 -		if ( typeof t != "string" )
 22.1230 -			return [ t ];
 22.1231 -
 22.1232 -		// Make sure that the context is a DOM Element
 22.1233 -		if ( context && !context.nodeType )
 22.1234 -			context = null;
 22.1235 -
 22.1236 -		// Set the correct context (if none is provided)
 22.1237 -		context = context || document;
 22.1238 -
 22.1239 -		// Initialize the search
 22.1240 -		var ret = [context], done = [], last;
 22.1241 -
 22.1242 -		// Continue while a selector expression exists, and while
 22.1243 -		// we're no longer looping upon ourselves
 22.1244 -		while ( t && last != t ) {
 22.1245 -			var r = [];
 22.1246 -			last = t;
 22.1247 -
 22.1248 -			t = jQuery.trim(t);
 22.1249 -
 22.1250 -			var foundToken = false;
 22.1251 -
 22.1252 -			// An attempt at speeding up child selectors that
 22.1253 -			// point to a specific element tag
 22.1254 -			var re = quickChild;
 22.1255 -			var m = re.exec(t);
 22.1256 -
 22.1257 -			if ( m ) {
 22.1258 -				var nodeName = m[1].toUpperCase();
 22.1259 -
 22.1260 -				// Perform our own iteration and filter
 22.1261 -				for ( var i = 0; ret[i]; i++ )
 22.1262 -					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
 22.1263 -						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
 22.1264 -							r.push( c );
 22.1265 -
 22.1266 -				ret = r;
 22.1267 -				t = t.replace( re, "" );
 22.1268 -				if ( t.indexOf(" ") == 0 ) continue;
 22.1269 -				foundToken = true;
 22.1270 -			} else {
 22.1271 -				re = /^([>+~])\s*(\w*)/i;
 22.1272 -
 22.1273 -				if ( (m = re.exec(t)) != null ) {
 22.1274 -					r = [];
 22.1275 -
 22.1276 -					var nodeName = m[2], merge = {};
 22.1277 -					m = m[1];
 22.1278 -
 22.1279 -					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
 22.1280 -						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
 22.1281 -						for ( ; n; n = n.nextSibling )
 22.1282 -							if ( n.nodeType == 1 ) {
 22.1283 -								var id = jQuery.data(n);
 22.1284 -
 22.1285 -								if ( m == "~" && merge[id] ) break;
 22.1286 -								
 22.1287 -								if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
 22.1288 -									if ( m == "~" ) merge[id] = true;
 22.1289 -									r.push( n );
 22.1290 -								}
 22.1291 -								
 22.1292 -								if ( m == "+" ) break;
 22.1293 -							}
 22.1294 -					}
 22.1295 -
 22.1296 -					ret = r;
 22.1297 -
 22.1298 -					// And remove the token
 22.1299 -					t = jQuery.trim( t.replace( re, "" ) );
 22.1300 -					foundToken = true;
 22.1301 -				}
 22.1302 -			}
 22.1303 -
 22.1304 -			// See if there's still an expression, and that we haven't already
 22.1305 -			// matched a token
 22.1306 -			if ( t && !foundToken ) {
 22.1307 -				// Handle multiple expressions
 22.1308 -				if ( !t.indexOf(",") ) {
 22.1309 -					// Clean the result set
 22.1310 -					if ( context == ret[0] ) ret.shift();
 22.1311 -
 22.1312 -					// Merge the result sets
 22.1313 -					done = jQuery.merge( done, ret );
 22.1314 -
 22.1315 -					// Reset the context
 22.1316 -					r = ret = [context];
 22.1317 -
 22.1318 -					// Touch up the selector string
 22.1319 -					t = " " + t.substr(1,t.length);
 22.1320 -
 22.1321 -				} else {
 22.1322 -					// Optimize for the case nodeName#idName
 22.1323 -					var re2 = quickID;
 22.1324 -					var m = re2.exec(t);
 22.1325 -					
 22.1326 -					// Re-organize the results, so that they're consistent
 22.1327 -					if ( m ) {
 22.1328 -					   m = [ 0, m[2], m[3], m[1] ];
 22.1329 -
 22.1330 -					} else {
 22.1331 -						// Otherwise, do a traditional filter check for
 22.1332 -						// ID, class, and element selectors
 22.1333 -						re2 = quickClass;
 22.1334 -						m = re2.exec(t);
 22.1335 -					}
 22.1336 -
 22.1337 -					m[2] = m[2].replace(/\\/g, "");
 22.1338 -
 22.1339 -					var elem = ret[ret.length-1];
 22.1340 -
 22.1341 -					// Try to do a global search by ID, where we can
 22.1342 -					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 22.1343 -						// Optimization for HTML document case
 22.1344 -						var oid = elem.getElementById(m[2]);
 22.1345 -						
 22.1346 -						// Do a quick check for the existence of the actual ID attribute
 22.1347 -						// to avoid selecting by the name attribute in IE
 22.1348 -						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
 22.1349 -						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
 22.1350 -							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
 22.1351 -
 22.1352 -						// Do a quick check for node name (where applicable) so
 22.1353 -						// that div#foo searches will be really fast
 22.1354 -						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 22.1355 -					} else {
 22.1356 -						// We need to find all descendant elements
 22.1357 -						for ( var i = 0; ret[i]; i++ ) {
 22.1358 -							// Grab the tag name being searched for
 22.1359 -							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 22.1360 -
 22.1361 -							// Handle IE7 being really dumb about <object>s
 22.1362 -							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 22.1363 -								tag = "param";
 22.1364 -
 22.1365 -							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
 22.1366 -						}
 22.1367 -
 22.1368 -						// It's faster to filter by class and be done with it
 22.1369 -						if ( m[1] == "." )
 22.1370 -							r = jQuery.classFilter( r, m[2] );
 22.1371 -
 22.1372 -						// Same with ID filtering
 22.1373 -						if ( m[1] == "#" ) {
 22.1374 -							var tmp = [];
 22.1375 -
 22.1376 -							// Try to find the element with the ID
 22.1377 -							for ( var i = 0; r[i]; i++ )
 22.1378 -								if ( r[i].getAttribute("id") == m[2] ) {
 22.1379 -									tmp = [ r[i] ];
 22.1380 -									break;
 22.1381 -								}
 22.1382 -
 22.1383 -							r = tmp;
 22.1384 -						}
 22.1385 -
 22.1386 -						ret = r;
 22.1387 -					}
 22.1388 -
 22.1389 -					t = t.replace( re2, "" );
 22.1390 -				}
 22.1391 -
 22.1392 -			}
 22.1393 -
 22.1394 -			// If a selector string still exists
 22.1395 -			if ( t ) {
 22.1396 -				// Attempt to filter it
 22.1397 -				var val = jQuery.filter(t,r);
 22.1398 -				ret = r = val.r;
 22.1399 -				t = jQuery.trim(val.t);
 22.1400 -			}
 22.1401 -		}
 22.1402 -
 22.1403 -		// An error occurred with the selector;
 22.1404 -		// just return an empty set instead
 22.1405 -		if ( t )
 22.1406 -			ret = [];
 22.1407 -
 22.1408 -		// Remove the root context
 22.1409 -		if ( ret && context == ret[0] )
 22.1410 -			ret.shift();
 22.1411 -
 22.1412 -		// And combine the results
 22.1413 -		done = jQuery.merge( done, ret );
 22.1414 -
 22.1415 -		return done;
 22.1416 -	},
 22.1417 -
 22.1418 -	classFilter: function(r,m,not){
 22.1419 -		m = " " + m + " ";
 22.1420 -		var tmp = [];
 22.1421 -		for ( var i = 0; r[i]; i++ ) {
 22.1422 -			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
 22.1423 -			if ( !not && pass || not && !pass )
 22.1424 -				tmp.push( r[i] );
 22.1425 -		}
 22.1426 -		return tmp;
 22.1427 -	},
 22.1428 -
 22.1429 -	filter: function(t,r,not) {
 22.1430 -		var last;
 22.1431 -
 22.1432 -		// Look for common filter expressions
 22.1433 -		while ( t  && t != last ) {
 22.1434 -			last = t;
 22.1435 -
 22.1436 -			var p = jQuery.parse, m;
 22.1437 -
 22.1438 -			for ( var i = 0; p[i]; i++ ) {
 22.1439 -				m = p[i].exec( t );
 22.1440 -
 22.1441 -				if ( m ) {
 22.1442 -					// Remove what we just matched
 22.1443 -					t = t.substring( m[0].length );
 22.1444 -
 22.1445 -					m[2] = m[2].replace(/\\/g, "");
 22.1446 -					break;
 22.1447 -				}
 22.1448 -			}
 22.1449 -
 22.1450 -			if ( !m )
 22.1451 -				break;
 22.1452 -
 22.1453 -			// :not() is a special case that can be optimized by
 22.1454 -			// keeping it out of the expression list
 22.1455 -			if ( m[1] == ":" && m[2] == "not" )
 22.1456 -				r = jQuery.filter(m[3], r, true).r;
 22.1457 -
 22.1458 -			// We can get a big speed boost by filtering by class here
 22.1459 -			else if ( m[1] == "." )
 22.1460 -				r = jQuery.classFilter(r, m[2], not);
 22.1461 -
 22.1462 -			else if ( m[1] == "[" ) {
 22.1463 -				var tmp = [], type = m[3];
 22.1464 -				
 22.1465 -				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 22.1466 -					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
 22.1467 -					
 22.1468 -					if ( z == null || /href|src|selected/.test(m[2]) )
 22.1469 -						z = jQuery.attr(a,m[2]) || '';
 22.1470 -
 22.1471 -					if ( (type == "" && !!z ||
 22.1472 -						 type == "=" && z == m[5] ||
 22.1473 -						 type == "!=" && z != m[5] ||
 22.1474 -						 type == "^=" && z && !z.indexOf(m[5]) ||
 22.1475 -						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
 22.1476 -						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
 22.1477 -							tmp.push( a );
 22.1478 -				}
 22.1479 -				
 22.1480 -				r = tmp;
 22.1481 -
 22.1482 -			// We can get a speed boost by handling nth-child here
 22.1483 -			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
 22.1484 -				var merge = {}, tmp = [],
 22.1485 -					test = /(\d*)n\+?(\d*)/.exec(
 22.1486 -						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
 22.1487 -						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
 22.1488 -					first = (test[1] || 1) - 0, last = test[2] - 0;
 22.1489 -
 22.1490 -				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 22.1491 -					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
 22.1492 -
 22.1493 -					if ( !merge[id] ) {
 22.1494 -						var c = 1;
 22.1495 -
 22.1496 -						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
 22.1497 -							if ( n.nodeType == 1 )
 22.1498 -								n.nodeIndex = c++;
 22.1499 -
 22.1500 -						merge[id] = true;
 22.1501 -					}
 22.1502 -
 22.1503 -					var add = false;
 22.1504 -
 22.1505 -					if ( first == 1 ) {
 22.1506 -						if ( last == 0 || node.nodeIndex == last )
 22.1507 -							add = true;
 22.1508 -					} else if ( (node.nodeIndex + last) % first == 0 )
 22.1509 -						add = true;
 22.1510 -
 22.1511 -					if ( add ^ not )
 22.1512 -						tmp.push( node );
 22.1513 -				}
 22.1514 -
 22.1515 -				r = tmp;
 22.1516 -
 22.1517 -			// Otherwise, find the expression to execute
 22.1518 -			} else {
 22.1519 -				var f = jQuery.expr[m[1]];
 22.1520 -				if ( typeof f != "string" )
 22.1521 -					f = jQuery.expr[m[1]][m[2]];
 22.1522 -
 22.1523 -				// Build a custom macro to enclose it
 22.1524 -				f = eval("false||function(a,i){return " + f + "}");
 22.1525 -
 22.1526 -				// Execute it against the current filter
 22.1527 -				r = jQuery.grep( r, f, not );
 22.1528 -			}
 22.1529 -		}
 22.1530 -
 22.1531 -		// Return an array of filtered elements (r)
 22.1532 -		// and the modified expression string (t)
 22.1533 -		return { r: r, t: t };
 22.1534 -	},
 22.1535 -
 22.1536 -	dir: function( elem, dir ){
 22.1537 -		var matched = [];
 22.1538 -		var cur = elem[dir];
 22.1539 -		while ( cur && cur != document ) {
 22.1540 -			if ( cur.nodeType == 1 )
 22.1541 -				matched.push( cur );
 22.1542 -			cur = cur[dir];
 22.1543 -		}
 22.1544 -		return matched;
 22.1545 -	},
 22.1546 -	
 22.1547 -	nth: function(cur,result,dir,elem){
 22.1548 -		result = result || 1;
 22.1549 -		var num = 0;
 22.1550 -
 22.1551 -		for ( ; cur; cur = cur[dir] )
 22.1552 -			if ( cur.nodeType == 1 && ++num == result )
 22.1553 -				break;
 22.1554 -
 22.1555 -		return cur;
 22.1556 -	},
 22.1557 -	
 22.1558 -	sibling: function( n, elem ) {
 22.1559 -		var r = [];
 22.1560 -
 22.1561 -		for ( ; n; n = n.nextSibling ) {
 22.1562 -			if ( n.nodeType == 1 && (!elem || n != elem) )
 22.1563 -				r.push( n );
 22.1564 -		}
 22.1565 -
 22.1566 -		return r;
 22.1567 -	}
 22.1568 -});
 22.1569 -/*
 22.1570 - * A number of helper functions used for managing events.
 22.1571 - * Many of the ideas behind this code orignated from 
 22.1572 - * Dean Edwards' addEvent library.
 22.1573 - */
 22.1574 -jQuery.event = {
 22.1575 -
 22.1576 -	// Bind an event to an element
 22.1577 -	// Original by Dean Edwards
 22.1578 -	add: function(element, type, handler, data) {
 22.1579 -		// For whatever reason, IE has trouble passing the window object
 22.1580 -		// around, causing it to be cloned in the process
 22.1581 -		if ( jQuery.browser.msie && element.setInterval != undefined )
 22.1582 -			element = window;
 22.1583 -
 22.1584 -		// Make sure that the function being executed has a unique ID
 22.1585 -		if ( !handler.guid )
 22.1586 -			handler.guid = this.guid++;
 22.1587 -			
 22.1588 -		// if data is passed, bind to handler 
 22.1589 -		if( data != undefined ) { 
 22.1590 -        		// Create temporary function pointer to original handler 
 22.1591 -			var fn = handler; 
 22.1592 -
 22.1593 -			// Create unique handler function, wrapped around original handler 
 22.1594 -			handler = function() { 
 22.1595 -				// Pass arguments and context to original handler 
 22.1596 -				return fn.apply(this, arguments); 
 22.1597 -			};
 22.1598 -
 22.1599 -			// Store data in unique handler 
 22.1600 -			handler.data = data;
 22.1601 -
 22.1602 -			// Set the guid of unique handler to the same of original handler, so it can be removed 
 22.1603 -			handler.guid = fn.guid;
 22.1604 -		}
 22.1605 -
 22.1606 -		// Namespaced event handlers
 22.1607 -		var parts = type.split(".");
 22.1608 -		type = parts[0];
 22.1609 -		handler.type = parts[1];
 22.1610 -
 22.1611 -		// Init the element's event structure
 22.1612 -		var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
 22.1613 -		
 22.1614 -		var handle = jQuery.data(element, "handle", function(){
 22.1615 -			// returned undefined or false
 22.1616 -			var val;
 22.1617 -
 22.1618 -			// Handle the second event of a trigger and when
 22.1619 -			// an event is called after a page has unloaded
 22.1620 -			if ( typeof jQuery == "undefined" || jQuery.event.triggered )
 22.1621 -				return val;
 22.1622 -			
 22.1623 -			val = jQuery.event.handle.apply(element, arguments);
 22.1624 -			
 22.1625 -			return val;
 22.1626 -		});
 22.1627 -
 22.1628 -		// Get the current list of functions bound to this event
 22.1629 -		var handlers = events[type];
 22.1630 -
 22.1631 -		// Init the event handler queue
 22.1632 -		if (!handlers) {
 22.1633 -			handlers = events[type] = {};	
 22.1634 -			
 22.1635 -			// And bind the global event handler to the element
 22.1636 -			if (element.addEventListener)
 22.1637 -				element.addEventListener(type, handle, false);
 22.1638 -			else
 22.1639 -				element.attachEvent("on" + type, handle);
 22.1640 -		}
 22.1641 -
 22.1642 -		// Add the function to the element's handler list
 22.1643 -		handlers[handler.guid] = handler;
 22.1644 -
 22.1645 -		// Keep track of which events have been used, for global triggering
 22.1646 -		this.global[type] = true;
 22.1647 -	},
 22.1648 -
 22.1649 -	guid: 1,
 22.1650 -	global: {},
 22.1651 -
 22.1652 -	// Detach an event or set of events from an element
 22.1653 -	remove: function(element, type, handler) {
 22.1654 -		var events = jQuery.data(element, "events"), ret, index;
 22.1655 -
 22.1656 -		// Namespaced event handlers
 22.1657 -		if ( typeof type == "string" ) {
 22.1658 -			var parts = type.split(".");
 22.1659 -			type = parts[0];
 22.1660 -		}
 22.1661 -
 22.1662 -		if ( events ) {
 22.1663 -			// type is actually an event object here
 22.1664 -			if ( type && type.type ) {
 22.1665 -				handler = type.handler;
 22.1666 -				type = type.type;
 22.1667 -			}
 22.1668 -			
 22.1669 -			if ( !type ) {
 22.1670 -				for ( type in events )
 22.1671 -					this.remove( element, type );
 22.1672 -
 22.1673 -			} else if ( events[type] ) {
 22.1674 -				// remove the given handler for the given type
 22.1675 -				if ( handler )
 22.1676 -					delete events[type][handler.guid];
 22.1677 -				
 22.1678 -				// remove all handlers for the given type
 22.1679 -				else
 22.1680 -					for ( handler in events[type] )
 22.1681 -						// Handle the removal of namespaced events
 22.1682 -						if ( !parts[1] || events[type][handler].type == parts[1] )
 22.1683 -							delete events[type][handler];
 22.1684 -
 22.1685 -				// remove generic event handler if no more handlers exist
 22.1686 -				for ( ret in events[type] ) break;
 22.1687 -				if ( !ret ) {
 22.1688 -					if (element.removeEventListener)
 22.1689 -						element.removeEventListener(type, jQuery.data(element, "handle"), false);
 22.1690 -					else
 22.1691 -						element.detachEvent("on" + type, jQuery.data(element, "handle"));
 22.1692 -					ret = null;
 22.1693 -					delete events[type];
 22.1694 -				}
 22.1695 -			}
 22.1696 -
 22.1697 -			// Remove the expando if it's no longer used
 22.1698 -			for ( ret in events ) break;
 22.1699 -			if ( !ret ) {
 22.1700 -				jQuery.removeData( element, "events" );
 22.1701 -				jQuery.removeData( element, "handle" );
 22.1702 -			}
 22.1703 -		}
 22.1704 -	},
 22.1705 -
 22.1706 -	trigger: function(type, data, element, donative, extra) {
 22.1707 -		// Clone the incoming data, if any
 22.1708 -		data = jQuery.makeArray(data || []);
 22.1709 -
 22.1710 -		// Handle a global trigger
 22.1711 -		if ( !element ) {
 22.1712 -			// Only trigger if we've ever bound an event for it
 22.1713 -			if ( this.global[type] )
 22.1714 -				jQuery("*").add([window, document]).trigger(type, data);
 22.1715 -
 22.1716 -		// Handle triggering a single element
 22.1717 -		} else {
 22.1718 -			var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
 22.1719 -				// Check to see if we need to provide a fake event, or not
 22.1720 -				evt = !data[0] || !data[0].preventDefault;
 22.1721 -			
 22.1722 -			// Pass along a fake event
 22.1723 -			if ( evt )
 22.1724 -				data.unshift( this.fix({ type: type, target: element }) );
 22.1725 -
 22.1726 -			// Enforce the right trigger type
 22.1727 -			data[0].type = type;
 22.1728 -
 22.1729 -			// Trigger the event
 22.1730 -			if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
 22.1731 -				val = jQuery.data(element, "handle").apply( element, data );
 22.1732 -
 22.1733 -			// Handle triggering native .onfoo handlers
 22.1734 -			if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
 22.1735 -				val = false;
 22.1736 -
 22.1737 -			// Extra functions don't get the custom event object
 22.1738 -			if ( evt )
 22.1739 -				data.shift();
 22.1740 -
 22.1741 -			// Handle triggering of extra function
 22.1742 -			if ( extra && extra.apply( element, data ) === false )
 22.1743 -				val = false;
 22.1744 -
 22.1745 -			// Trigger the native events (except for clicks on links)
 22.1746 -			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
 22.1747 -				this.triggered = true;
 22.1748 -				element[ type ]();
 22.1749 -			}
 22.1750 -
 22.1751 -			this.triggered = false;
 22.1752 -		}
 22.1753 -
 22.1754 -		return val;
 22.1755 -	},
 22.1756 -
 22.1757 -	handle: function(event) {
 22.1758 -		// returned undefined or false
 22.1759 -		var val;
 22.1760 -
 22.1761 -		// Empty object is for triggered events with no data
 22.1762 -		event = jQuery.event.fix( event || window.event || {} ); 
 22.1763 -
 22.1764 -		// Namespaced event handlers
 22.1765 -		var parts = event.type.split(".");
 22.1766 -		event.type = parts[0];
 22.1767 -
 22.1768 -		var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
 22.1769 -		args.unshift( event );
 22.1770 -
 22.1771 -		for ( var j in c ) {
 22.1772 -			// Pass in a reference to the handler function itself
 22.1773 -			// So that we can later remove it
 22.1774 -			args[0].handler = c[j];
 22.1775 -			args[0].data = c[j].data;
 22.1776 -
 22.1777 -			// Filter the functions by class
 22.1778 -			if ( !parts[1] || c[j].type == parts[1] ) {
 22.1779 -				var tmp = c[j].apply( this, args );
 22.1780 -
 22.1781 -				if ( val !== false )
 22.1782 -					val = tmp;
 22.1783 -
 22.1784 -				if ( tmp === false ) {
 22.1785 -					event.preventDefault();
 22.1786 -					event.stopPropagation();
 22.1787 -				}
 22.1788 -			}
 22.1789 -		}
 22.1790 -
 22.1791 -		// Clean up added properties in IE to prevent memory leak
 22.1792 -		if (jQuery.browser.msie)
 22.1793 -			event.target = event.preventDefault = event.stopPropagation =
 22.1794 -				event.handler = event.data = null;
 22.1795 -
 22.1796 -		return val;
 22.1797 -	},
 22.1798 -
 22.1799 -	fix: function(event) {
 22.1800 -		// store a copy of the original event object 
 22.1801 -		// and clone to set read-only properties
 22.1802 -		var originalEvent = event;
 22.1803 -		event = jQuery.extend({}, originalEvent);
 22.1804 -		
 22.1805 -		// add preventDefault and stopPropagation since 
 22.1806 -		// they will not work on the clone
 22.1807 -		event.preventDefault = function() {
 22.1808 -			// if preventDefault exists run it on the original event
 22.1809 -			if (originalEvent.preventDefault)
 22.1810 -				originalEvent.preventDefault();
 22.1811 -			// otherwise set the returnValue property of the original event to false (IE)
 22.1812 -			originalEvent.returnValue = false;
 22.1813 -		};
 22.1814 -		event.stopPropagation = function() {
 22.1815 -			// if stopPropagation exists run it on the original event
 22.1816 -			if (originalEvent.stopPropagation)
 22.1817 -				originalEvent.stopPropagation();
 22.1818 -			// otherwise set the cancelBubble property of the original event to true (IE)
 22.1819 -			originalEvent.cancelBubble = true;
 22.1820 -		};
 22.1821 -		
 22.1822 -		// Fix target property, if necessary
 22.1823 -		if ( !event.target && event.srcElement )
 22.1824 -			event.target = event.srcElement;
 22.1825 -				
 22.1826 -		// check if target is a textnode (safari)
 22.1827 -		if (jQuery.browser.safari && event.target.nodeType == 3)
 22.1828 -			event.target = originalEvent.target.parentNode;
 22.1829 -
 22.1830 -		// Add relatedTarget, if necessary
 22.1831 -		if ( !event.relatedTarget && event.fromElement )
 22.1832 -			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
 22.1833 -
 22.1834 -		// Calculate pageX/Y if missing and clientX/Y available
 22.1835 -		if ( event.pageX == null && event.clientX != null ) {
 22.1836 -			var e = document.documentElement, b = document.body;
 22.1837 -			event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
 22.1838 -			event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
 22.1839 -		}
 22.1840 -			
 22.1841 -		// Add which for key events
 22.1842 -		if ( !event.which && (event.charCode || event.keyCode) )
 22.1843 -			event.which = event.charCode || event.keyCode;
 22.1844 -		
 22.1845 -		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 22.1846 -		if ( !event.metaKey && event.ctrlKey )
 22.1847 -			event.metaKey = event.ctrlKey;
 22.1848 -
 22.1849 -		// Add which for click: 1 == left; 2 == middle; 3 == right
 22.1850 -		// Note: button is not normalized, so don't use it
 22.1851 -		if ( !event.which && event.button )
 22.1852 -			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 22.1853 -			
 22.1854 -		return event;
 22.1855 -	}
 22.1856 -};
 22.1857 -
 22.1858 -jQuery.fn.extend({
 22.1859 -	bind: function( type, data, fn ) {
 22.1860 -		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
 22.1861 -			jQuery.event.add( this, type, fn || data, fn && data );
 22.1862 -		});
 22.1863 -	},
 22.1864 -	
 22.1865 -	one: function( type, data, fn ) {
 22.1866 -		return this.each(function(){
 22.1867 -			jQuery.event.add( this, type, function(event) {
 22.1868 -				jQuery(this).unbind(event);
 22.1869 -				return (fn || data).apply( this, arguments);
 22.1870 -			}, fn && data);
 22.1871 -		});
 22.1872 -	},
 22.1873 -
 22.1874 -	unbind: function( type, fn ) {
 22.1875 -		return this.each(function(){
 22.1876 -			jQuery.event.remove( this, type, fn );
 22.1877 -		});
 22.1878 -	},
 22.1879 -
 22.1880 -	trigger: function( type, data, fn ) {
 22.1881 -		return this.each(function(){
 22.1882 -			jQuery.event.trigger( type, data, this, true, fn );
 22.1883 -		});
 22.1884 -	},
 22.1885 -
 22.1886 -	triggerHandler: function( type, data, fn ) {
 22.1887 -		if ( this[0] )
 22.1888 -			return jQuery.event.trigger( type, data, this[0], false, fn );
 22.1889 -	},
 22.1890 -
 22.1891 -	toggle: function() {
 22.1892 -		// Save reference to arguments for access in closure
 22.1893 -		var a = arguments;
 22.1894 -
 22.1895 -		return this.click(function(e) {
 22.1896 -			// Figure out which function to execute
 22.1897 -			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
 22.1898 -			
 22.1899 -			// Make sure that clicks stop
 22.1900 -			e.preventDefault();
 22.1901 -			
 22.1902 -			// and execute the function
 22.1903 -			return a[this.lastToggle].apply( this, [e] ) || false;
 22.1904 -		});
 22.1905 -	},
 22.1906 -
 22.1907 -	hover: function(f,g) {
 22.1908 -		
 22.1909 -		// A private function for handling mouse 'hovering'
 22.1910 -		function handleHover(e) {
 22.1911 -			// Check if mouse(over|out) are still within the same parent element
 22.1912 -			var p = e.relatedTarget;
 22.1913 -	
 22.1914 -			// Traverse up the tree
 22.1915 -			while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
 22.1916 -			
 22.1917 -			// If we actually just moused on to a sub-element, ignore it
 22.1918 -			if ( p == this ) return false;
 22.1919 -			
 22.1920 -			// Execute the right function
 22.1921 -			return (e.type == "mouseover" ? f : g).apply(this, [e]);
 22.1922 -		}
 22.1923 -		
 22.1924 -		// Bind the function to the two event listeners
 22.1925 -		return this.mouseover(handleHover).mouseout(handleHover);
 22.1926 -	},
 22.1927 -	
 22.1928 -	ready: function(f) {
 22.1929 -		// Attach the listeners
 22.1930 -		bindReady();
 22.1931 -
 22.1932 -		// If the DOM is already ready
 22.1933 -		if ( jQuery.isReady )
 22.1934 -			// Execute the function immediately
 22.1935 -			f.apply( document, [jQuery] );
 22.1936 -			
 22.1937 -		// Otherwise, remember the function for later
 22.1938 -		else
 22.1939 -			// Add the function to the wait list
 22.1940 -			jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
 22.1941 -	
 22.1942 -		return this;
 22.1943 -	}
 22.1944 -});
 22.1945 -
 22.1946 -jQuery.extend({
 22.1947 -	/*
 22.1948 -	 * All the code that makes DOM Ready work nicely.
 22.1949 -	 */
 22.1950 -	isReady: false,
 22.1951 -	readyList: [],
 22.1952 -	
 22.1953 -	// Handle when the DOM is ready
 22.1954 -	ready: function() {
 22.1955 -		// Make sure that the DOM is not already loaded
 22.1956 -		if ( !jQuery.isReady ) {
 22.1957 -			// Remember that the DOM is ready
 22.1958 -			jQuery.isReady = true;
 22.1959 -			
 22.1960 -			// If there are functions bound, to execute
 22.1961 -			if ( jQuery.readyList ) {
 22.1962 -				// Execute all of them
 22.1963 -				jQuery.each( jQuery.readyList, function(){
 22.1964 -					this.apply( document );
 22.1965 -				});
 22.1966 -				
 22.1967 -				// Reset the list of functions
 22.1968 -				jQuery.readyList = null;
 22.1969 -			}
 22.1970 -			// Remove event listener to avoid memory leak
 22.1971 -			if ( jQuery.browser.mozilla || jQuery.browser.opera )
 22.1972 -				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
 22.1973 -			
 22.1974 -			// Remove script element used by IE hack
 22.1975 -			if( !window.frames.length ) // don't remove if frames are present (#1187)
 22.1976 -				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
 22.1977 -		}
 22.1978 -	}
 22.1979 -});
 22.1980 -
 22.1981 -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
 22.1982 -	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
 22.1983 -	"submit,keydown,keypress,keyup,error").split(","), function(i,o){
 22.1984 -	
 22.1985 -	// Handle event binding
 22.1986 -	jQuery.fn[o] = function(f){
 22.1987 -		return f ? this.bind(o, f) : this.trigger(o);
 22.1988 -	};
 22.1989 -});
 22.1990 -
 22.1991 -var readyBound = false;
 22.1992 -
 22.1993 -function bindReady(){
 22.1994 -	if ( readyBound ) return;
 22.1995 -	readyBound = true;
 22.1996 -
 22.1997 -	// If Mozilla is used
 22.1998 -	if ( jQuery.browser.mozilla || jQuery.browser.opera )
 22.1999 -		// Use the handy event callback
 22.2000 -		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
 22.2001 -	
 22.2002 -	// If IE is used, use the excellent hack by Matthias Miller
 22.2003 -	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
 22.2004 -	else if ( jQuery.browser.msie ) {
 22.2005 -	
 22.2006 -		// Only works if you document.write() it
 22.2007 -		document.write("<scr" + "ipt id=__ie_init defer=true " + 
 22.2008 -			"src=//:><\/script>");
 22.2009 -	
 22.2010 -		// Use the defer script hack
 22.2011 -		var script = document.getElementById("__ie_init");
 22.2012 -		
 22.2013 -		// script does not exist if jQuery is loaded dynamically
 22.2014 -		if ( script ) 
 22.2015 -			script.onreadystatechange = function() {
 22.2016 -				if ( this.readyState != "complete" ) return;
 22.2017 -				jQuery.ready();
 22.2018 -			};
 22.2019 -	
 22.2020 -		// Clear from memory
 22.2021 -		script = null;
 22.2022 -	
 22.2023 -	// If Safari  is used
 22.2024 -	} else if ( jQuery.browser.safari )
 22.2025 -		// Continually check to see if the document.readyState is valid
 22.2026 -		jQuery.safariTimer = setInterval(function(){
 22.2027 -			// loaded and complete are both valid states
 22.2028 -			if ( document.readyState == "loaded" || 
 22.2029 -				document.readyState == "complete" ) {
 22.2030 -	
 22.2031 -				// If either one are found, remove the timer
 22.2032 -				clearInterval( jQuery.safariTimer );
 22.2033 -				jQuery.safariTimer = null;
 22.2034 -	
 22.2035 -				// and execute any waiting functions
 22.2036 -				jQuery.ready();
 22.2037 -			}
 22.2038 -		}, 10); 
 22.2039 -
 22.2040 -	// A fallback to window.onload, that will always work
 22.2041 -	jQuery.event.add( window, "load", jQuery.ready );
 22.2042 -}
 22.2043 -jQuery.fn.extend({
 22.2044 -	load: function( url, params, callback ) {
 22.2045 -		if ( jQuery.isFunction( url ) )
 22.2046 -			return this.bind("load", url);
 22.2047 -
 22.2048 -		var off = url.indexOf(" ");
 22.2049 -		if ( off >= 0 ) {
 22.2050 -			var selector = url.slice(off, url.length);
 22.2051 -			url = url.slice(0, off);
 22.2052 -		}
 22.2053 -
 22.2054 -		callback = callback || function(){};
 22.2055 -
 22.2056 -		// Default to a GET request
 22.2057 -		var type = "GET";
 22.2058 -
 22.2059 -		// If the second parameter was provided
 22.2060 -		if ( params )
 22.2061 -			// If it's a function
 22.2062 -			if ( jQuery.isFunction( params ) ) {
 22.2063 -				// We assume that it's the callback
 22.2064 -				callback = params;
 22.2065 -				params = null;
 22.2066 -
 22.2067 -			// Otherwise, build a param string
 22.2068 -			} else {
 22.2069 -				params = jQuery.param( params );
 22.2070 -				type = "POST";
 22.2071 -			}
 22.2072 -
 22.2073 -		var self = this;
 22.2074 -
 22.2075 -		// Request the remote document
 22.2076 -		jQuery.ajax({
 22.2077 -			url: url,
 22.2078 -			type: type,
 22.2079 -			data: params,
 22.2080 -			complete: function(res, status){
 22.2081 -				// If successful, inject the HTML into all the matched elements
 22.2082 -				if ( status == "success" || status == "notmodified" )
 22.2083 -					// See if a selector was specified
 22.2084 -					self.html( selector ?
 22.2085 -						// Create a dummy div to hold the results
 22.2086 -						jQuery("<div/>")
 22.2087 -							// inject the contents of the document in, removing the scripts
 22.2088 -							// to avoid any 'Permission Denied' errors in IE
 22.2089 -							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
 22.2090 -
 22.2091 -							// Locate the specified elements
 22.2092 -							.find(selector) :
 22.2093 -
 22.2094 -						// If not, just inject the full result
 22.2095 -						res.responseText );
 22.2096 -
 22.2097 -				// Add delay to account for Safari's delay in globalEval
 22.2098 -				setTimeout(function(){
 22.2099 -					self.each( callback, [res.responseText, status, res] );
 22.2100 -				}, 13);
 22.2101 -			}
 22.2102 -		});
 22.2103 -		return this;
 22.2104 -	},
 22.2105 -
 22.2106 -	serialize: function() {
 22.2107 -		return jQuery.param(this.serializeArray());
 22.2108 -	},
 22.2109 -	serializeArray: function() {
 22.2110 -		return this.map(function(){
 22.2111 -			return jQuery.nodeName(this, "form") ?
 22.2112 -				jQuery.makeArray(this.elements) : this;
 22.2113 -		})
 22.2114 -		.filter(function(){
 22.2115 -			return this.name && !this.disabled && 
 22.2116 -				(this.checked || /select|textarea/i.test(this.nodeName) || 
 22.2117 -					/text|hidden|password/i.test(this.type));
 22.2118 -		})
 22.2119 -		.map(function(i, elem){
 22.2120 -			var val = jQuery(this).val();
 22.2121 -			return val == null ? null :
 22.2122 -				val.constructor == Array ?
 22.2123 -					jQuery.map( val, function(val, i){
 22.2124 -						return {name: elem.name, value: val};
 22.2125 -					}) :
 22.2126 -					{name: elem.name, value: val};
 22.2127 -		}).get();
 22.2128 -	}
 22.2129 -});
 22.2130 -
 22.2131 -// Attach a bunch of functions for handling common AJAX events
 22.2132 -jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 22.2133 -	jQuery.fn[o] = function(f){
 22.2134 -		return this.bind(o, f);
 22.2135 -	};
 22.2136 -});
 22.2137 -
 22.2138 -var jsc = (new Date).getTime();
 22.2139 -
 22.2140 -jQuery.extend({
 22.2141 -	get: function( url, data, callback, type ) {
 22.2142 -		// shift arguments if data argument was ommited
 22.2143 -		if ( jQuery.isFunction( data ) ) {
 22.2144 -			callback = data;
 22.2145 -			data = null;
 22.2146 -		}
 22.2147 -		
 22.2148 -		return jQuery.ajax({
 22.2149 -			type: "GET",
 22.2150 -			url: url,
 22.2151 -			data: data,
 22.2152 -			success: callback,
 22.2153 -			dataType: type
 22.2154 -		});
 22.2155 -	},
 22.2156 -
 22.2157 -	getScript: function( url, callback ) {
 22.2158 -		return jQuery.get(url, null, callback, "script");
 22.2159 -	},
 22.2160 -
 22.2161 -	getJSON: function( url, data, callback ) {
 22.2162 -		return jQuery.get(url, data, callback, "json");
 22.2163 -	},
 22.2164 -
 22.2165 -	post: function( url, data, callback, type ) {
 22.2166 -		if ( jQuery.isFunction( data ) ) {
 22.2167 -			callback = data;
 22.2168 -			data = {};
 22.2169 -		}
 22.2170 -
 22.2171 -		return jQuery.ajax({
 22.2172 -			type: "POST",
 22.2173 -			url: url,
 22.2174 -			data: data,
 22.2175 -			success: callback,
 22.2176 -			dataType: type
 22.2177 -		});
 22.2178 -	},
 22.2179 -
 22.2180 -	ajaxSetup: function( settings ) {
 22.2181 -		jQuery.extend( jQuery.ajaxSettings, settings );
 22.2182 -	},
 22.2183 -
 22.2184 -	ajaxSettings: {
 22.2185 -		global: true,
 22.2186 -		type: "GET",
 22.2187 -		timeout: 0,
 22.2188 -		contentType: "application/x-www-form-urlencoded",
 22.2189 -		processData: true,
 22.2190 -		async: true,
 22.2191 -		data: null
 22.2192 -	},
 22.2193 -	
 22.2194 -	// Last-Modified header cache for next request
 22.2195 -	lastModified: {},
 22.2196 -
 22.2197 -	ajax: function( s ) {
 22.2198 -		var jsonp, jsre = /=(\?|%3F)/g, status, data;
 22.2199 -
 22.2200 -		// Extend the settings, but re-extend 's' so that it can be
 22.2201 -		// checked again later (in the test suite, specifically)
 22.2202 -		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 22.2203 -
 22.2204 -		// convert data if not already a string
 22.2205 -		if ( s.data && s.processData && typeof s.data != "string" )
 22.2206 -			s.data = jQuery.param(s.data);
 22.2207 -
 22.2208 -		// Handle JSONP Parameter Callbacks
 22.2209 -		if ( s.dataType == "jsonp" ) {
 22.2210 -			if ( s.type.toLowerCase() == "get" ) {
 22.2211 -				if ( !s.url.match(jsre) )
 22.2212 -					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
 22.2213 -			} else if ( !s.data || !s.data.match(jsre) )
 22.2214 -				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
 22.2215 -			s.dataType = "json";
 22.2216 -		}
 22.2217 -
 22.2218 -		// Build temporary JSONP function
 22.2219 -		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
 22.2220 -			jsonp = "jsonp" + jsc++;
 22.2221 -
 22.2222 -			// Replace the =? sequence both in the query string and the data
 22.2223 -			if ( s.data )
 22.2224 -				s.data = s.data.replace(jsre, "=" + jsonp);
 22.2225 -			s.url = s.url.replace(jsre, "=" + jsonp);
 22.2226 -
 22.2227 -			// We need to make sure
 22.2228 -			// that a JSONP style response is executed properly
 22.2229 -			s.dataType = "script";
 22.2230 -
 22.2231 -			// Handle JSONP-style loading
 22.2232 -			window[ jsonp ] = function(tmp){
 22.2233 -				data = tmp;
 22.2234 -				success();
 22.2235 -				complete();
 22.2236 -				// Garbage collect
 22.2237 -				window[ jsonp ] = undefined;
 22.2238 -				try{ delete window[ jsonp ]; } catch(e){}
 22.2239 -			};
 22.2240 -		}
 22.2241 -
 22.2242 -		if ( s.dataType == "script" && s.cache == null )
 22.2243 -			s.cache = false;
 22.2244 -
 22.2245 -		if ( s.cache === false && s.type.toLowerCase() == "get" )
 22.2246 -			s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
 22.2247 -
 22.2248 -		// If data is available, append data to url for get requests
 22.2249 -		if ( s.data && s.type.toLowerCase() == "get" ) {
 22.2250 -			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
 22.2251 -
 22.2252 -			// IE likes to send both get and post data, prevent this
 22.2253 -			s.data = null;
 22.2254 -		}
 22.2255 -
 22.2256 -		// Watch for a new set of requests
 22.2257 -		if ( s.global && ! jQuery.active++ )
 22.2258 -			jQuery.event.trigger( "ajaxStart" );
 22.2259 -
 22.2260 -		// If we're requesting a remote document
 22.2261 -		// and trying to load JSON or Script
 22.2262 -		if ( !s.url.indexOf("http") && s.dataType == "script" ) {
 22.2263 -			var head = document.getElementsByTagName("head")[0];
 22.2264 -			var script = document.createElement("script");
 22.2265 -			script.src = s.url;
 22.2266 -
 22.2267 -			// Handle Script loading
 22.2268 -			if ( !jsonp && (s.success || s.complete) ) {
 22.2269 -				var done = false;
 22.2270 -
 22.2271 -				// Attach handlers for all browsers
 22.2272 -				script.onload = script.onreadystatechange = function(){
 22.2273 -					if ( !done && (!this.readyState || 
 22.2274 -							this.readyState == "loaded" || this.readyState == "complete") ) {
 22.2275 -						done = true;
 22.2276 -						success();
 22.2277 -						complete();
 22.2278 -						head.removeChild( script );
 22.2279 -					}
 22.2280 -				};
 22.2281 -			}
 22.2282 -
 22.2283 -			head.appendChild(script);
 22.2284 -
 22.2285 -			// We handle everything using the script element injection
 22.2286 -			return;
 22.2287 -		}
 22.2288 -
 22.2289 -		var requestDone = false;
 22.2290 -
 22.2291 -		// Create the request object; Microsoft failed to properly
 22.2292 -		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
 22.2293 -		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 22.2294 -
 22.2295 -		// Open the socket
 22.2296 -		xml.open(s.type, s.url, s.async);
 22.2297 -
 22.2298 -		// Set the correct header, if data is being sent
 22.2299 -		if ( s.data )
 22.2300 -			xml.setRequestHeader("Content-Type", s.contentType);
 22.2301 -
 22.2302 -		// Set the If-Modified-Since header, if ifModified mode.
 22.2303 -		if ( s.ifModified )
 22.2304 -			xml.setRequestHeader("If-Modified-Since",
 22.2305 -				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 22.2306 -
 22.2307 -		// Set header so the called script knows that it's an XMLHttpRequest
 22.2308 -		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 22.2309 -
 22.2310 -		// Allow custom headers/mimetypes
 22.2311 -		if ( s.beforeSend )
 22.2312 -			s.beforeSend(xml);
 22.2313 -			
 22.2314 -		if ( s.global )
 22.2315 -		    jQuery.event.trigger("ajaxSend", [xml, s]);
 22.2316 -
 22.2317 -		// Wait for a response to come back
 22.2318 -		var onreadystatechange = function(isTimeout){
 22.2319 -			// The transfer is complete and the data is available, or the request timed out
 22.2320 -			if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
 22.2321 -				requestDone = true;
 22.2322 -				
 22.2323 -				// clear poll interval
 22.2324 -				if (ival) {
 22.2325 -					clearInterval(ival);
 22.2326 -					ival = null;
 22.2327 -				}
 22.2328 -				
 22.2329 -				status = isTimeout == "timeout" && "timeout" ||
 22.2330 -					!jQuery.httpSuccess( xml ) && "error" ||
 22.2331 -					s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
 22.2332 -					"success";
 22.2333 -
 22.2334 -				if ( status == "success" ) {
 22.2335 -					// Watch for, and catch, XML document parse errors
 22.2336 -					try {
 22.2337 -						// process the data (runs the xml through httpData regardless of callback)
 22.2338 -						data = jQuery.httpData( xml, s.dataType );
 22.2339 -					} catch(e) {
 22.2340 -						status = "parsererror";
 22.2341 -					}
 22.2342 -				}
 22.2343 -
 22.2344 -				// Make sure that the request was successful or notmodified
 22.2345 -				if ( status == "success" ) {
 22.2346 -					// Cache Last-Modified header, if ifModified mode.
 22.2347 -					var modRes;
 22.2348 -					try {
 22.2349 -						modRes = xml.getResponseHeader("Last-Modified");
 22.2350 -					} catch(e) {} // swallow exception thrown by FF if header is not available
 22.2351 -	
 22.2352 -					if ( s.ifModified && modRes )
 22.2353 -						jQuery.lastModified[s.url] = modRes;
 22.2354 -
 22.2355 -					// JSONP handles its own success callback
 22.2356 -					if ( !jsonp )
 22.2357 -						success();	
 22.2358 -				} else
 22.2359 -					jQuery.handleError(s, xml, status);
 22.2360 -
 22.2361 -				// Fire the complete handlers
 22.2362 -				complete();
 22.2363 -
 22.2364 -				// Stop memory leaks
 22.2365 -				if ( s.async )
 22.2366 -					xml = null;
 22.2367 -			}
 22.2368 -		};
 22.2369 -		
 22.2370 -		if ( s.async ) {
 22.2371 -			// don't attach the handler to the request, just poll it instead
 22.2372 -			var ival = setInterval(onreadystatechange, 13); 
 22.2373 -
 22.2374 -			// Timeout checker
 22.2375 -			if ( s.timeout > 0 )
 22.2376 -				setTimeout(function(){
 22.2377 -					// Check to see if the request is still happening
 22.2378 -					if ( xml ) {
 22.2379 -						// Cancel the request
 22.2380 -						xml.abort();
 22.2381 -	
 22.2382 -						if( !requestDone )
 22.2383 -							onreadystatechange( "timeout" );
 22.2384 -					}
 22.2385 -				}, s.timeout);
 22.2386 -		}
 22.2387 -			
 22.2388 -		// Send the data
 22.2389 -		try {
 22.2390 -			xml.send(s.data);
 22.2391 -		} catch(e) {
 22.2392 -			jQuery.handleError(s, xml, null, e);
 22.2393 -		}
 22.2394 -		
 22.2395 -		// firefox 1.5 doesn't fire statechange for sync requests
 22.2396 -		if ( !s.async )
 22.2397 -			onreadystatechange();
 22.2398 -		
 22.2399 -		// return XMLHttpRequest to allow aborting the request etc.
 22.2400 -		return xml;
 22.2401 -
 22.2402 -		function success(){
 22.2403 -			// If a local callback was specified, fire it and pass it the data
 22.2404 -			if ( s.success )
 22.2405 -				s.success( data, status );
 22.2406 -
 22.2407 -			// Fire the global callback
 22.2408 -			if ( s.global )
 22.2409 -				jQuery.event.trigger( "ajaxSuccess", [xml, s] );
 22.2410 -		}
 22.2411 -
 22.2412 -		function complete(){
 22.2413 -			// Process result
 22.2414 -			if ( s.complete )
 22.2415 -				s.complete(xml, status);
 22.2416 -
 22.2417 -			// The request was completed
 22.2418 -			if ( s.global )
 22.2419 -				jQuery.event.trigger( "ajaxComplete", [xml, s] );
 22.2420 -
 22.2421 -			// Handle the global AJAX counter
 22.2422 -			if ( s.global && ! --jQuery.active )
 22.2423 -				jQuery.event.trigger( "ajaxStop" );
 22.2424 -		}
 22.2425 -	},
 22.2426 -
 22.2427 -	handleError: function( s, xml, status, e ) {
 22.2428 -		// If a local callback was specified, fire it
 22.2429 -		if ( s.error ) s.error( xml, status, e );
 22.2430 -
 22.2431 -		// Fire the global callback
 22.2432 -		if ( s.global )
 22.2433 -			jQuery.event.trigger( "ajaxError", [xml, s, e] );
 22.2434 -	},
 22.2435 -
 22.2436 -	// Counter for holding the number of active queries
 22.2437 -	active: 0,
 22.2438 -
 22.2439 -	// Determines if an XMLHttpRequest was successful or not
 22.2440 -	httpSuccess: function( r ) {
 22.2441 -		try {
 22.2442 -			return !r.status && location.protocol == "file:" ||
 22.2443 -				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
 22.2444 -				jQuery.browser.safari && r.status == undefined;
 22.2445 -		} catch(e){}
 22.2446 -		return false;
 22.2447 -	},
 22.2448 -
 22.2449 -	// Determines if an XMLHttpRequest returns NotModified
 22.2450 -	httpNotModified: function( xml, url ) {
 22.2451 -		try {
 22.2452 -			var xmlRes = xml.getResponseHeader("Last-Modified");
 22.2453 -
 22.2454 -			// Firefox always returns 200. check Last-Modified date
 22.2455 -			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
 22.2456 -				jQuery.browser.safari && xml.status == undefined;
 22.2457 -		} catch(e){}
 22.2458 -		return false;
 22.2459 -	},
 22.2460 -
 22.2461 -	httpData: function( r, type ) {
 22.2462 -		var ct = r.getResponseHeader("content-type");
 22.2463 -		var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
 22.2464 -		var data = xml ? r.responseXML : r.responseText;
 22.2465 -
 22.2466 -		if ( xml && data.documentElement.tagName == "parsererror" )
 22.2467 -			throw "parsererror";
 22.2468 -
 22.2469 -		// If the type is "script", eval it in global context
 22.2470 -		if ( type == "script" )
 22.2471 -			jQuery.globalEval( data );
 22.2472 -
 22.2473 -		// Get the JavaScript object, if JSON is used.
 22.2474 -		if ( type == "json" )
 22.2475 -			data = eval("(" + data + ")");
 22.2476 -
 22.2477 -		return data;
 22.2478 -	},
 22.2479 -
 22.2480 -	// Serialize an array of form elements or a set of
 22.2481 -	// key/values into a query string
 22.2482 -	param: function( a ) {
 22.2483 -		var s = [];
 22.2484 -
 22.2485 -		// If an array was passed in, assume that it is an array
 22.2486 -		// of form elements
 22.2487 -		if ( a.constructor == Array || a.jquery )
 22.2488 -			// Serialize the form elements
 22.2489 -			jQuery.each( a, function(){
 22.2490 -				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
 22.2491 -			});
 22.2492 -
 22.2493 -		// Otherwise, assume that it's an object of key/value pairs
 22.2494 -		else
 22.2495 -			// Serialize the key/values
 22.2496 -			for ( var j in a )
 22.2497 -				// If the value is an array then the key names need to be repeated
 22.2498 -				if ( a[j] && a[j].constructor == Array )
 22.2499 -					jQuery.each( a[j], function(){
 22.2500 -						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 22.2501 -					});
 22.2502 -				else
 22.2503 -					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
 22.2504 -
 22.2505 -		// Return the resulting serialization
 22.2506 -		return s.join("&").replace(/%20/g, "+");
 22.2507 -	}
 22.2508 -
 22.2509 -});
 22.2510 -jQuery.fn.extend({
 22.2511 -	show: function(speed,callback){
 22.2512 -		return speed ?
 22.2513 -			this.animate({
 22.2514 -				height: "show", width: "show", opacity: "show"
 22.2515 -			}, speed, callback) :
 22.2516 -			
 22.2517 -			this.filter(":hidden").each(function(){
 22.2518 -				this.style.display = this.oldblock ? this.oldblock : "";
 22.2519 -				if ( jQuery.css(this,"display") == "none" )
 22.2520 -					this.style.display = "block";
 22.2521 -			}).end();
 22.2522 -	},
 22.2523 -	
 22.2524 -	hide: function(speed,callback){
 22.2525 -		return speed ?
 22.2526 -			this.animate({
 22.2527 -				height: "hide", width: "hide", opacity: "hide"
 22.2528 -			}, speed, callback) :
 22.2529 -			
 22.2530 -			this.filter(":visible").each(function(){
 22.2531 -				this.oldblock = this.oldblock || jQuery.css(this,"display");
 22.2532 -				if ( this.oldblock == "none" )
 22.2533 -					this.oldblock = "block";
 22.2534 -				this.style.display = "none";
 22.2535 -			}).end();
 22.2536 -	},
 22.2537 -
 22.2538 -	// Save the old toggle function
 22.2539 -	_toggle: jQuery.fn.toggle,
 22.2540 -	
 22.2541 -	toggle: function( fn, fn2 ){
 22.2542 -		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
 22.2543 -			this._toggle( fn, fn2 ) :
 22.2544 -			fn ?
 22.2545 -				this.animate({
 22.2546 -					height: "toggle", width: "toggle", opacity: "toggle"
 22.2547 -				}, fn, fn2) :
 22.2548 -				this.each(function(){
 22.2549 -					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
 22.2550 -				});
 22.2551 -	},
 22.2552 -	
 22.2553 -	slideDown: function(speed,callback){
 22.2554 -		return this.animate({height: "show"}, speed, callback);
 22.2555 -	},
 22.2556 -	
 22.2557 -	slideUp: function(speed,callback){
 22.2558 -		return this.animate({height: "hide"}, speed, callback);
 22.2559 -	},
 22.2560 -
 22.2561 -	slideToggle: function(speed, callback){
 22.2562 -		return this.animate({height: "toggle"}, speed, callback);
 22.2563 -	},
 22.2564 -	
 22.2565 -	fadeIn: function(speed, callback){
 22.2566 -		return this.animate({opacity: "show"}, speed, callback);
 22.2567 -	},
 22.2568 -	
 22.2569 -	fadeOut: function(speed, callback){
 22.2570 -		return this.animate({opacity: "hide"}, speed, callback);
 22.2571 -	},
 22.2572 -	
 22.2573 -	fadeTo: function(speed,to,callback){
 22.2574 -		return this.animate({opacity: to}, speed, callback);
 22.2575 -	},
 22.2576 -	
 22.2577 -	animate: function( prop, speed, easing, callback ) {
 22.2578 -		var opt = jQuery.speed(speed, easing, callback);
 22.2579 -
 22.2580 -		return this[ opt.queue === false ? "each" : "queue" ](function(){
 22.2581 -			opt = jQuery.extend({}, opt);
 22.2582 -			var hidden = jQuery(this).is(":hidden"), self = this;
 22.2583 -			
 22.2584 -			for ( var p in prop ) {
 22.2585 -				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
 22.2586 -					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
 22.2587 -
 22.2588 -				if ( p == "height" || p == "width" ) {
 22.2589 -					// Store display property
 22.2590 -					opt.display = jQuery.css(this, "display");
 22.2591 -
 22.2592 -					// Make sure that nothing sneaks out
 22.2593 -					opt.overflow = this.style.overflow;
 22.2594 -				}
 22.2595 -			}
 22.2596 -
 22.2597 -			if ( opt.overflow != null )
 22.2598 -				this.style.overflow = "hidden";
 22.2599 -
 22.2600 -			opt.curAnim = jQuery.extend({}, prop);
 22.2601 -			
 22.2602 -			jQuery.each( prop, function(name, val){
 22.2603 -				var e = new jQuery.fx( self, opt, name );
 22.2604 -
 22.2605 -				if ( /toggle|show|hide/.test(val) )
 22.2606 -					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 22.2607 -				else {
 22.2608 -					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
 22.2609 -						start = e.cur(true) || 0;
 22.2610 -
 22.2611 -					if ( parts ) {
 22.2612 -						var end = parseFloat(parts[2]),
 22.2613 -							unit = parts[3] || "px";
 22.2614 -
 22.2615 -						// We need to compute starting value
 22.2616 -						if ( unit != "px" ) {
 22.2617 -							self.style[ name ] = (end || 1) + unit;
 22.2618 -							start = ((end || 1) / e.cur(true)) * start;
 22.2619 -							self.style[ name ] = start + unit;
 22.2620 -						}
 22.2621 -
 22.2622 -						// If a +=/-= token was provided, we're doing a relative animation
 22.2623 -						if ( parts[1] )
 22.2624 -							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
 22.2625 -
 22.2626 -						e.custom( start, end, unit );
 22.2627 -					} else
 22.2628 -						e.custom( start, val, "" );
 22.2629 -				}
 22.2630 -			});
 22.2631 -
 22.2632 -			// For JS strict compliance
 22.2633 -			return true;
 22.2634 -		});
 22.2635 -	},
 22.2636 -	
 22.2637 -	queue: function(type, fn){
 22.2638 -		if ( jQuery.isFunction(type) ) {
 22.2639 -			fn = type;
 22.2640 -			type = "fx";
 22.2641 -		}
 22.2642 -
 22.2643 -		if ( !type || (typeof type == "string" && !fn) )
 22.2644 -			return queue( this[0], type );
 22.2645 -
 22.2646 -		return this.each(function(){
 22.2647 -			if ( fn.constructor == Array )
 22.2648 -				queue(this, type, fn);
 22.2649 -			else {
 22.2650 -				queue(this, type).push( fn );
 22.2651 -			
 22.2652 -				if ( queue(this, type).length == 1 )
 22.2653 -					fn.apply(this);
 22.2654 -			}
 22.2655 -		});
 22.2656 -	},
 22.2657 -
 22.2658 -	stop: function(){
 22.2659 -		var timers = jQuery.timers;
 22.2660 -
 22.2661 -		return this.each(function(){
 22.2662 -			for ( var i = 0; i < timers.length; i++ )
 22.2663 -				if ( timers[i].elem == this )
 22.2664 -					timers.splice(i--, 1);
 22.2665 -		}).dequeue();
 22.2666 -	}
 22.2667 -
 22.2668 -});
 22.2669 -
 22.2670 -var queue = function( elem, type, array ) {
 22.2671 -	if ( !elem )
 22.2672 -		return;
 22.2673 -
 22.2674 -	var q = jQuery.data( elem, type + "queue" );
 22.2675 -
 22.2676 -	if ( !q || array )
 22.2677 -		q = jQuery.data( elem, type + "queue", 
 22.2678 -			array ? jQuery.makeArray(array) : [] );
 22.2679 -
 22.2680 -	return q;
 22.2681 -};
 22.2682 -
 22.2683 -jQuery.fn.dequeue = function(type){
 22.2684 -	type = type || "fx";
 22.2685 -
 22.2686 -	return this.each(function(){
 22.2687 -		var q = queue(this, type);
 22.2688 -
 22.2689 -		q.shift();
 22.2690 -
 22.2691 -		if ( q.length )
 22.2692 -			q[0].apply( this );
 22.2693 -	});
 22.2694 -};
 22.2695 -
 22.2696 -jQuery.extend({
 22.2697 -	
 22.2698 -	speed: function(speed, easing, fn) {
 22.2699 -		var opt = speed && speed.constructor == Object ? speed : {
 22.2700 -			complete: fn || !fn && easing || 
 22.2701 -				jQuery.isFunction( speed ) && speed,
 22.2702 -			duration: speed,
 22.2703 -			easing: fn && easing || easing && easing.constructor != Function && easing
 22.2704 -		};
 22.2705 -
 22.2706 -		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
 22.2707 -			opt.duration : 
 22.2708 -			{ slow: 600, fast: 200 }[opt.duration]) || 400;
 22.2709 -	
 22.2710 -		// Queueing
 22.2711 -		opt.old = opt.complete;
 22.2712 -		opt.complete = function(){
 22.2713 -			jQuery(this).dequeue();
 22.2714 -			if ( jQuery.isFunction( opt.old ) )
 22.2715 -				opt.old.apply( this );
 22.2716 -		};
 22.2717 -	
 22.2718 -		return opt;
 22.2719 -	},
 22.2720 -	
 22.2721 -	easing: {
 22.2722 -		linear: function( p, n, firstNum, diff ) {
 22.2723 -			return firstNum + diff * p;
 22.2724 -		},
 22.2725 -		swing: function( p, n, firstNum, diff ) {
 22.2726 -			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 22.2727 -		}
 22.2728 -	},
 22.2729 -	
 22.2730 -	timers: [],
 22.2731 -
 22.2732 -	fx: function( elem, options, prop ){
 22.2733 -		this.options = options;
 22.2734 -		this.elem = elem;
 22.2735 -		this.prop = prop;
 22.2736 -
 22.2737 -		if ( !options.orig )
 22.2738 -			options.orig = {};
 22.2739 -	}
 22.2740 -
 22.2741 -});
 22.2742 -
 22.2743 -jQuery.fx.prototype = {
 22.2744 -
 22.2745 -	// Simple function for setting a style value
 22.2746 -	update: function(){
 22.2747 -		if ( this.options.step )
 22.2748 -			this.options.step.apply( this.elem, [ this.now, this ] );
 22.2749 -
 22.2750 -		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 22.2751 -
 22.2752 -		// Set display property to block for height/width animations
 22.2753 -		if ( this.prop == "height" || this.prop == "width" )
 22.2754 -			this.elem.style.display = "block";
 22.2755 -	},
 22.2756 -
 22.2757 -	// Get the current size
 22.2758 -	cur: function(force){
 22.2759 -		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
 22.2760 -			return this.elem[ this.prop ];
 22.2761 -
 22.2762 -		var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
 22.2763 -		return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
 22.2764 -	},
 22.2765 -
 22.2766 -	// Start an animation from one number to another
 22.2767 -	custom: function(from, to, unit){
 22.2768 -		this.startTime = (new Date()).getTime();
 22.2769 -		this.start = from;
 22.2770 -		this.end = to;
 22.2771 -		this.unit = unit || this.unit || "px";
 22.2772 -		this.now = this.start;
 22.2773 -		this.pos = this.state = 0;
 22.2774 -		this.update();
 22.2775 -
 22.2776 -		var self = this;
 22.2777 -		function t(){
 22.2778 -			return self.step();
 22.2779 -		}
 22.2780 -
 22.2781 -		t.elem = this.elem;
 22.2782 -
 22.2783 -		jQuery.timers.push(t);
 22.2784 -
 22.2785 -		if ( jQuery.timers.length == 1 ) {
 22.2786 -			var timer = setInterval(function(){
 22.2787 -				var timers = jQuery.timers;
 22.2788 -				
 22.2789 -				for ( var i = 0; i < timers.length; i++ )
 22.2790 -					if ( !timers[i]() )
 22.2791 -						timers.splice(i--, 1);
 22.2792 -
 22.2793 -				if ( !timers.length )
 22.2794 -					clearInterval( timer );
 22.2795 -			}, 13);
 22.2796 -		}
 22.2797 -	},
 22.2798 -
 22.2799 -	// Simple 'show' function
 22.2800 -	show: function(){
 22.2801 -		// Remember where we started, so that we can go back to it later
 22.2802 -		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 22.2803 -		this.options.show = true;
 22.2804 -
 22.2805 -		// Begin the animation
 22.2806 -		this.custom(0, this.cur());
 22.2807 -
 22.2808 -		// Make sure that we start at a small width/height to avoid any
 22.2809 -		// flash of content
 22.2810 -		if ( this.prop == "width" || this.prop == "height" )
 22.2811 -			this.elem.style[this.prop] = "1px";
 22.2812 -		
 22.2813 -		// Start by showing the element
 22.2814 -		jQuery(this.elem).show();
 22.2815 -	},
 22.2816 -
 22.2817 -	// Simple 'hide' function
 22.2818 -	hide: function(){
 22.2819 -		// Remember where we started, so that we can go back to it later
 22.2820 -		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 22.2821 -		this.options.hide = true;
 22.2822 -
 22.2823 -		// Begin the animation
 22.2824 -		this.custom(this.cur(), 0);
 22.2825 -	},
 22.2826 -
 22.2827 -	// Each step of an animation
 22.2828 -	step: function(){
 22.2829 -		var t = (new Date()).getTime();
 22.2830 -
 22.2831 -		if ( t > this.options.duration + this.startTime ) {
 22.2832 -			this.now = this.end;
 22.2833 -			this.pos = this.state = 1;
 22.2834 -			this.update();
 22.2835 -
 22.2836 -			this.options.curAnim[ this.prop ] = true;
 22.2837 -
 22.2838 -			var done = true;
 22.2839 -			for ( var i in this.options.curAnim )
 22.2840 -				if ( this.options.curAnim[i] !== true )
 22.2841 -					done = false;
 22.2842 -
 22.2843 -			if ( done ) {
 22.2844 -				if ( this.options.display != null ) {
 22.2845 -					// Reset the overflow
 22.2846 -					this.elem.style.overflow = this.options.overflow;
 22.2847 -				
 22.2848 -					// Reset the display
 22.2849 -					this.elem.style.display = this.options.display;
 22.2850 -					if ( jQuery.css(this.elem, "display") == "none" )
 22.2851 -						this.elem.style.display = "block";
 22.2852 -				}
 22.2853 -
 22.2854 -				// Hide the element if the "hide" operation was done
 22.2855 -				if ( this.options.hide )
 22.2856 -					this.elem.style.display = "none";
 22.2857 -
 22.2858 -				// Reset the properties, if the item has been hidden or shown
 22.2859 -				if ( this.options.hide || this.options.show )
 22.2860 -					for ( var p in this.options.curAnim )
 22.2861 -						jQuery.attr(this.elem.style, p, this.options.orig[p]);
 22.2862 -			}
 22.2863 -
 22.2864 -			// If a callback was provided, execute it
 22.2865 -			if ( done && jQuery.isFunction( this.options.complete ) )
 22.2866 -				// Execute the complete function
 22.2867 -				this.options.complete.apply( this.elem );
 22.2868 -
 22.2869 -			return false;
 22.2870 -		} else {
 22.2871 -			var n = t - this.startTime;
 22.2872 -			this.state = n / this.options.duration;
 22.2873 -
 22.2874 -			// Perform the easing function, defaults to swing
 22.2875 -			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
 22.2876 -			this.now = this.start + ((this.end - this.start) * this.pos);
 22.2877 -
 22.2878 -			// Perform the next step of the animation
 22.2879 -			this.update();
 22.2880 -		}
 22.2881 -
 22.2882 -		return true;
 22.2883 -	}
 22.2884 -
 22.2885 -};
 22.2886 -
 22.2887 -jQuery.fx.step = {
 22.2888 -	scrollLeft: function(fx){
 22.2889 -		fx.elem.scrollLeft = fx.now;
 22.2890 -	},
 22.2891 -
 22.2892 -	scrollTop: function(fx){
 22.2893 -		fx.elem.scrollTop = fx.now;
 22.2894 -	},
 22.2895 -
 22.2896 -	opacity: function(fx){
 22.2897 -		jQuery.attr(fx.elem.style, "opacity", fx.now);
 22.2898 -	},
 22.2899 -
 22.2900 -	_default: function(fx){
 22.2901 -		fx.elem.style[ fx.prop ] = fx.now + fx.unit;
 22.2902 -	}
 22.2903 -};
 22.2904 -// The Offset Method
 22.2905 -// Originally By Brandon Aaron, part of the Dimension Plugin
 22.2906 -// http://jquery.com/plugins/project/dimensions
 22.2907 -jQuery.fn.offset = function() {
 22.2908 -	var left = 0, top = 0, elem = this[0], results;
 22.2909 -	
 22.2910 -	if ( elem ) with ( jQuery.browser ) {
 22.2911 -		var	absolute     = jQuery.css(elem, "position") == "absolute", 
 22.2912 -		    parent       = elem.parentNode, 
 22.2913 -		    offsetParent = elem.offsetParent, 
 22.2914 -		    doc          = elem.ownerDocument,
 22.2915 -		    safari2      = safari && parseInt(version) < 522;
 22.2916 -	
 22.2917 -		// Use getBoundingClientRect if available
 22.2918 -		if ( elem.getBoundingClientRect ) {
 22.2919 -			box = elem.getBoundingClientRect();
 22.2920 -		
 22.2921 -			// Add the document scroll offsets
 22.2922 -			add(
 22.2923 -				box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 22.2924 -				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop)
 22.2925 -			);
 22.2926 -		
 22.2927 -			// IE adds the HTML element's border, by default it is medium which is 2px
 22.2928 -			// IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; }
 22.2929 -			// IE 7 standards mode, the border is always 2px
 22.2930 -			if ( msie ) {
 22.2931 -				var border = jQuery("html").css("borderWidth");
 22.2932 -				border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
 22.2933 -				add( -border, -border );
 22.2934 -			}
 22.2935 -	
 22.2936 -		// Otherwise loop through the offsetParents and parentNodes
 22.2937 -		} else {
 22.2938 -		
 22.2939 -			// Initial element offsets
 22.2940 -			add( elem.offsetLeft, elem.offsetTop );
 22.2941 -		
 22.2942 -			// Get parent offsets
 22.2943 -			while ( offsetParent ) {
 22.2944 -				// Add offsetParent offsets
 22.2945 -				add( offsetParent.offsetLeft, offsetParent.offsetTop );
 22.2946 -			
 22.2947 -				// Mozilla and Safari > 2 does not include the border on offset parents
 22.2948 -				// However Mozilla adds the border for table cells
 22.2949 -				if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
 22.2950 -					border( offsetParent );
 22.2951 -				
 22.2952 -				// Safari <= 2 doubles body offsets with an absolutely positioned element or parent
 22.2953 -				if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
 22.2954 -					absolute = true;
 22.2955 -			
 22.2956 -				// Get next offsetParent
 22.2957 -				offsetParent = offsetParent.offsetParent;
 22.2958 -			}
 22.2959 -		
 22.2960 -			// Get parent scroll offsets
 22.2961 -			while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
 22.2962 -				// Work around opera inline/table scrollLeft/Top bug
 22.2963 -				if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
 22.2964 -					// Subtract parent scroll offsets
 22.2965 -					add( -parent.scrollLeft, -parent.scrollTop );
 22.2966 -			
 22.2967 -				// Mozilla does not add the border for a parent that has overflow != visible
 22.2968 -				if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
 22.2969 -					border( parent );
 22.2970 -			
 22.2971 -				// Get next parent
 22.2972 -				parent = parent.parentNode;
 22.2973 -			}
 22.2974 -		
 22.2975 -			// Safari doubles body offsets with an absolutely positioned element or parent
 22.2976 -			if ( safari2 && absolute )
 22.2977 -				add( -doc.body.offsetLeft, -doc.body.offsetTop );
 22.2978 -		}
 22.2979 -
 22.2980 -		// Return an object with top and left properties
 22.2981 -		results = { top: top, left: left };
 22.2982 -	}
 22.2983 -
 22.2984 -	return results;
 22.2985 -
 22.2986 -	function border(elem) {
 22.2987 -		add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
 22.2988 -	}
 22.2989 -
 22.2990 -	function add(l, t) {
 22.2991 -		left += parseInt(l) || 0;
 22.2992 -		top += parseInt(t) || 0;
 22.2993 -	}
 22.2994 -};
 22.2995 -})();
    23.1 --- a/web/styles.css	Tue Oct 27 21:29:13 2009 -0700
    23.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    23.3 @@ -1,292 +0,0 @@
    23.4 -body {
    23.5 -  background: #f2f1f0;
    23.6 -  font-family: verdana,sans-serif;
    23.7 -}
    23.8 -
    23.9 -.navheader, .book, .preface, .chapter, .appendix, .bibliography, .navfooter, .basetemplate {
   23.10 -  width: 50em;
   23.11 -  margin-left: auto;
   23.12 -  margin-right: auto;
   23.13 -}
   23.14 -
   23.15 -a.commenttoggle:hover, a.commenttoggle:active {
   23.16 -  opacity: 0.7;
   23.17 -}
   23.18 -
   23.19 -a:hover, a:active {
   23.20 -  border-bottom: 1px solid #aaaaaa;
   23.21 -}
   23.22 -
   23.23 -.book, .preface, .chapter, .appendix, .bibliography, .basetemplate {
   23.24 -  background: white;
   23.25 -  padding: 2em;
   23.26 -}
   23.27 -
   23.28 -h1 {
   23.29 -  margin-top: 1.5em;
   23.30 -}
   23.31 -
   23.32 -span.beta {
   23.33 -  font-size: 80%;
   23.34 -  font-style: italic;
   23.35 -  opacity: 0.4;
   23.36 -}
   23.37 -
   23.38 -h2, h3 {
   23.39 -  margin-top: 2em;
   23.40 -}
   23.41 -
   23.42 -h1, h2, h3 {
   23.43 -  font-family: georgia,serif;
   23.44 -  font-weight: normal;
   23.45 -  margin-bottom: 0.5em;
   23.46 -}
   23.47 -
   23.48 -h1.booktitle {
   23.49 -  margin-bottom: 0px;
   23.50 -}
   23.51 -
   23.52 -h2.booktitle {
   23.53 -  text-align: center;
   23.54 -}
   23.55 -
   23.56 -h2.booktitle > a {
   23.57 -  color: black;
   23.58 -}
   23.59 -
   23.60 -div.authors {
   23.61 -  font-size: 80%;
   23.62 -  margin-bottom: 1em;
   23.63 -  padding-left: 0.25em;
   23.64 -}
   23.65 -
   23.66 -span.authors {
   23.67 -  font-size: 80%;
   23.68 -  opacity: 0.55;
   23.69 -  padding-left: 0.5em;
   23.70 -}
   23.71 -
   23.72 -div.note th, div.tip th, div.warning th {
   23.73 -  font-family: georgia,serif;
   23.74 -  font-weight: normal;
   23.75 -  font-size: 110%;
   23.76 -}
   23.77 -
   23.78 -div.navheader th, div.navfooter td {
   23.79 -  font-family: georgia,serif;
   23.80 -}
   23.81 -
   23.82 -div.navheader th {
   23.83 -  opacity: 0;
   23.84 -  font-size: 0;
   23.85 -}
   23.86 -
   23.87 -pre.screen {
   23.88 -  background-image: url(figs/shell.png);
   23.89 -}
   23.90 -
   23.91 -pre.programlisting {
   23.92 -  background-image: url(figs/source.png);
   23.93 -}
   23.94 -
   23.95 -pre.programlisting, pre.screen, p.remark {
   23.96 -  border-style: solid;
   23.97 -  border-width: 1px;
   23.98 -  font-size: medium;
   23.99 -  padding: 1em;
  23.100 -  background-repeat: no-repeat;
  23.101 -  background-position: 10px 10px;
  23.102 -  padding-left: 70px;
  23.103 -}
  23.104 -
  23.105 -strong.command, code, pre, span.type {
  23.106 -  font-family: monospace;
  23.107 -  font-weight: normal;
  23.108 -}
  23.109 -
  23.110 -strong.userinput > code {
  23.111 -  font-weight: bolder;
  23.112 -  color: #303030;
  23.113 -}
  23.114 -
  23.115 -div.toc > p {
  23.116 -  opacity: 0.35;
  23.117 -  font-family: georgia,serif;
  23.118 -  cursor: pointer;
  23.119 -}
  23.120 -
  23.121 -div.toc b {
  23.122 -  font-weight: normal;
  23.123 -  font-size: large;
  23.124 -}
  23.125 -
  23.126 -ul.booktoc {
  23.127 -  padding-left: 0px;
  23.128 -  list-style-type: none;
  23.129 -}
  23.130 -
  23.131 -.booktoc > li {
  23.132 -  padding: 0.5em;
  23.133 -}
  23.134 -
  23.135 -.chapinfo {
  23.136 -  float: right;
  23.137 -  color: #a0a0a0;
  23.138 -}
  23.139 -
  23.140 -.unpublished {
  23.141 -  color: #a0a0a0;
  23.142 -}
  23.143 -
  23.144 -.chapinfo img {
  23.145 -  vertical-align: -35%;
  23.146 -  border: 0px;
  23.147 -}
  23.148 -
  23.149 -.zebra_b {
  23.150 -  background: #f4f4f4;
  23.151 -}
  23.152 -
  23.153 -.book .titlepage {
  23.154 -  display: none;
  23.155 -}
  23.156 -
  23.157 -.chapter div.toc > dl {
  23.158 -  display: none;
  23.159 -}
  23.160 -
  23.161 -pre.programlisting, pre.screen, p.remark {
  23.162 -  overflow: hidden;
  23.163 -}
  23.164 -
  23.165 -p.remark {
  23.166 -  background-image: url(figs/remark.png);
  23.167 -}
  23.168 -
  23.169 -div.warning, p.remark {
  23.170 -  background-color: #FFEFE8;
  23.171 -  border-color: #e0a8a0;
  23.172 -}
  23.173 -
  23.174 -span.remark {
  23.175 -  font-style: normal;
  23.176 -  color: #707070;
  23.177 -}
  23.178 -
  23.179 -.screen {
  23.180 -  background: #e7ffc7 none repeat scroll 0% 50%;
  23.181 -  border-color: #94DA3A;
  23.182 -}
  23.183 -
  23.184 -.programlisting {
  23.185 -  background: #F0F4FF none repeat scroll 0% 50%;
  23.186 -  border-color: #B4BAEA;
  23.187 -}
  23.188 -
  23.189 -.prompt {
  23.190 -  color: #448844;
  23.191 -}
  23.192 -
  23.193 -div.note, div.tip {
  23.194 -  background: #ffffc9;
  23.195 -  border-color: #B4BAEA;
  23.196 -}
  23.197 -
  23.198 -div.note, div.warning, div.tip {
  23.199 -  border-style: solid;
  23.200 -  border-width: 1px;
  23.201 -  padding: 1em;
  23.202 -}
  23.203 -
  23.204 -.note .title {
  23.205 -  font-size: 90%;
  23.206 -}
  23.207 -
  23.208 -.comment {
  23.209 -  font-size: 80%;
  23.210 -}
  23.211 -
  23.212 -div.comment, div.new_comment {
  23.213 -  padding: 0.5em;
  23.214 -  margin: 0.5em;
  23.215 -  margin-left: 2em;
  23.216 -  border-style: solid;
  23.217 -  border-width: 1px;
  23.218 -  border-color: #aaaaff;
  23.219 -}
  23.220 -
  23.221 -div.comment {
  23.222 -  background: #eeeeff;
  23.223 -}
  23.224 -
  23.225 -div.new_comment {
  23.226 -  background: #d0d0ff;
  23.227 -}
  23.228 -
  23.229 -.commenttoggle {
  23.230 -  opacity: 0.35;
  23.231 -}
  23.232 -
  23.233 -.comment_help {
  23.234 -  font-size: 80%;
  23.235 -}
  23.236 -
  23.237 -.comment_header {
  23.238 -  opacity: 0.75;
  23.239 -}
  23.240 -
  23.241 -.comment_id {
  23.242 -  float: right;
  23.243 -  opacity: 0.3;
  23.244 -  font-size: 60%;
  23.245 -}
  23.246 -
  23.247 -.comment_name {
  23.248 -  font-weight: bolder;
  23.249 -}
  23.250 -
  23.251 -.comment_reviewed {
  23.252 -  color: darkgreen;
  23.253 -  margin-left: 1em;
  23.254 -  font-style: italic;
  23.255 -}
  23.256 -
  23.257 -.comment_date {
  23.258 -  opacity: 0.75;
  23.259 -}
  23.260 -
  23.261 -.comment_thanks {
  23.262 -  color: darkblue;
  23.263 -  margin-left: 1em;
  23.264 -  font-style: italic;
  23.265 -  font-weight: bolder;
  23.266 -}
  23.267 -
  23.268 -.comment_error {
  23.269 -  padding-left: 1em;
  23.270 -  font-weight: bolder;
  23.271 -  font-size: 80%;
  23.272 -  color: darkred;
  23.273 -}
  23.274 -
  23.275 -.hgfooter {
  23.276 -  width: 60em;
  23.277 -  margin-left: auto;
  23.278 -  margin-right: auto;
  23.279 -  margin-top: 2em;
  23.280 -  margin-bottom: 2em;
  23.281 -  font-size: 80%;
  23.282 -  color: #727272;
  23.283 -}
  23.284 -
  23.285 -.hgfooter a {
  23.286 -  color: #5555ff;
  23.287 -}
  23.288 -
  23.289 -.hgfooter a:visited {
  23.290 -  opacity: 0.7;
  23.291 -}
  23.292 -
  23.293 -.hgfooter img {
  23.294 -  vertical-align: -45%;
  23.295 -}
    24.1 Binary file web/support/icons/caution.png has changed
    25.1 Binary file web/support/icons/favicon.png has changed
    26.1 Binary file web/support/icons/important.png has changed
    27.1 Binary file web/support/icons/note.png has changed
    28.1 Binary file web/support/icons/remark.png has changed
    29.1 Binary file web/support/icons/rss.png has changed
    30.1 Binary file web/support/icons/shell.png has changed
    31.1 Binary file web/support/icons/source.png has changed
    32.1 Binary file web/support/icons/throbber.gif has changed
    33.1 Binary file web/support/icons/tip.png has changed
    34.1 Binary file web/support/icons/warning.png has changed
    35.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    35.2 +++ b/web/support/javascript/form-min.js	Tue Oct 27 21:31:06 2009 -0700
    35.3 @@ -0,0 +1,1 @@
    35.4 +(function($){$.fn.ajaxSubmit=function(_2){if(typeof _2=="function"){_2={success:_2};}_2=$.extend({url:this.attr("action")||window.location,type:this.attr("method")||"GET"},_2||{});var _3={};$.event.trigger("form.pre.serialize",[this,_2,_3]);if(_3.veto){return this;}var a=this.formToArray(_2.semantic);if(_2.data){for(var n in _2.data){a.push({name:n,value:_2.data[n]});}}if(_2.beforeSubmit&&_2.beforeSubmit(a,this,_2)===false){return this;}$.event.trigger("form.submit.validate",[a,this,_2,_3]);if(_3.veto){return this;}var q=$.param(a);if(_2.type.toUpperCase()=="GET"){_2.url+=(_2.url.indexOf("?")>=0?"&":"?")+q;_2.data=null;}else{_2.data=q;}var _7=this,callbacks=[];if(_2.resetForm){callbacks.push(function(){_7.resetForm();});}if(_2.clearForm){callbacks.push(function(){_7.clearForm();});}if(!_2.dataType&&_2.target){var _8=_2.success||function(){};callbacks.push(function(_9){if(this.evalScripts){$(_2.target).attr("innerHTML",_9).evalScripts().each(_8,arguments);}else{$(_2.target).html(_9).each(_8,arguments);}});}else{if(_2.success){callbacks.push(_2.success);}}_2.success=function(_a,_b){for(var i=0,max=callbacks.length;i<max;i++){callbacks[i](_a,_b,_7);}};var _d=$("input:file",this).fieldValue();var _e=false;for(var j=0;j<_d.length;j++){if(_d[j]){_e=true;}}if(_2.iframe||_e){fileUpload();}else{$.ajax(_2);}$.event.trigger("form.submit.notify",[this,_2]);return this;function fileUpload(){var _10=_7[0];var _11=$.extend({},$.ajaxSettings,_2);var id="jqFormIO"+$.fn.ajaxSubmit.counter++;var $io=$("<iframe id=\""+id+"\" name=\""+id+"\" />");var io=$io[0];var op8=$.browser.opera&&window.opera.version()<9;if($.browser.msie||op8){io.src="javascript:false;document.write(\"\");";}$io.css({position:"absolute",top:"-1000px",left:"-1000px"});var xhr={responseText:null,responseXML:null,status:0,statusText:"n/a",getAllResponseHeaders:function(){},getResponseHeader:function(){},setRequestHeader:function(){}};var g=_11.global;if(g&&!$.active++){$.event.trigger("ajaxStart");}if(g){$.event.trigger("ajaxSend",[xhr,_11]);}var _18=0;var _19=0;setTimeout(function(){$io.appendTo("body");io.attachEvent?io.attachEvent("onload",cb):io.addEventListener("load",cb,false);var _1a=_10.encoding?"encoding":"enctype";var t=_7.attr("target");_7.attr({target:id,method:"POST",action:_11.url});_10[_1a]="multipart/form-data";if(_11.timeout){setTimeout(function(){_19=true;cb();},_11.timeout);}_10.submit();_7.attr("target",t);},10);function cb(){if(_18++){return;}io.detachEvent?io.detachEvent("onload",cb):io.removeEventListener("load",cb,false);var ok=true;try{if(_19){throw "timeout";}var _1d,doc;doc=io.contentWindow?io.contentWindow.document:io.contentDocument?io.contentDocument:io.document;xhr.responseText=doc.body?doc.body.innerHTML:null;xhr.responseXML=doc.XMLDocument?doc.XMLDocument:doc;if(_11.dataType=="json"||_11.dataType=="script"){var ta=doc.getElementsByTagName("textarea")[0];_1d=ta?ta.value:xhr.responseText;if(_11.dataType=="json"){eval("data = "+_1d);}else{$.globalEval(_1d);}}else{if(_11.dataType=="xml"){_1d=xhr.responseXML;if(!_1d&&xhr.responseText!=null){_1d=toXml(xhr.responseText);}}else{_1d=xhr.responseText;}}}catch(e){ok=false;$.handleError(_11,xhr,"error",e);}if(ok){_11.success(_1d,"success");if(g){$.event.trigger("ajaxSuccess",[xhr,_11]);}}if(g){$.event.trigger("ajaxComplete",[xhr,_11]);}if(g&&!--$.active){$.event.trigger("ajaxStop");}if(_11.complete){_11.complete(xhr,ok?"success":"error");}setTimeout(function(){$io.remove();xhr.responseXML=null;},100);}function toXml(s,doc){if(window.ActiveXObject){doc=new ActiveXObject("Microsoft.XMLDOM");doc.async="false";doc.loadXML(s);}else{doc=(new DOMParser()).parseFromString(s,"text/xml");}return (doc&&doc.documentElement&&doc.documentElement.tagName!="parsererror")?doc:null;}}};$.fn.ajaxSubmit.counter=0;$.fn.ajaxForm=function(_21){return this.ajaxFormUnbind().submit(submitHandler).each(function(){this.formPluginId=$.fn.ajaxForm.counter++;$.fn.ajaxForm.optionHash[this.formPluginId]=_21;$(":submit,input:image",this).click(clickHandler);});};$.fn.ajaxForm.counter=1;$.fn.ajaxForm.optionHash={};function clickHandler(e){var _23=this.form;_23.clk=this;if(this.type=="image"){if(e.offsetX!=undefined){_23.clk_x=e.offsetX;_23.clk_y=e.offsetY;}else{if(typeof $.fn.offset=="function"){var _24=$(this).offset();_23.clk_x=e.pageX-_24.left;_23.clk_y=e.pageY-_24.top;}else{_23.clk_x=e.pageX-this.offsetLeft;_23.clk_y=e.pageY-this.offsetTop;}}}setTimeout(function(){_23.clk=_23.clk_x=_23.clk_y=null;},10);}function submitHandler(){var id=this.formPluginId;var _26=$.fn.ajaxForm.optionHash[id];$(this).ajaxSubmit(_26);return false;}$.fn.ajaxFormUnbind=function(){this.unbind("submit",submitHandler);return this.each(function(){$(":submit,input:image",this).unbind("click",clickHandler);});};$.fn.formToArray=function(_27){var a=[];if(this.length==0){return a;}var _29=this[0];var els=_27?_29.getElementsByTagName("*"):_29.elements;if(!els){return a;}for(var i=0,max=els.length;i<max;i++){var el=els[i];var n=el.name;if(!n){continue;}if(_27&&_29.clk&&el.type=="image"){if(!el.disabled&&_29.clk==el){a.push({name:n+".x",value:_29.clk_x},{name:n+".y",value:_29.clk_y});}continue;}var v=$.fieldValue(el,true);if(v&&v.constructor==Array){for(var j=0,jmax=v.length;j<jmax;j++){a.push({name:n,value:v[j]});}}else{if(v!==null&&typeof v!="undefined"){a.push({name:n,value:v});}}}if(!_27&&_29.clk){var _30=_29.getElementsByTagName("input");for(var i=0,max=_30.length;i<max;i++){var _32=_30[i];var n=_32.name;if(n&&!_32.disabled&&_32.type=="image"&&_29.clk==_32){a.push({name:n+".x",value:_29.clk_x},{name:n+".y",value:_29.clk_y});}}}return a;};$.fn.formSerialize=function(_34){return $.param(this.formToArray(_34));};$.fn.fieldSerialize=function(_35){var a=[];this.each(function(){var n=this.name;if(!n){return;}var v=$.fieldValue(this,_35);if(v&&v.constructor==Array){for(var i=0,max=v.length;i<max;i++){a.push({name:n,value:v[i]});}}else{if(v!==null&&typeof v!="undefined"){a.push({name:this.name,value:v});}}});return $.param(a);};$.fn.fieldValue=function(_3a){for(var val=[],i=0,max=this.length;i<max;i++){var el=this[i];var v=$.fieldValue(el,_3a);if(v===null||typeof v=="undefined"||(v.constructor==Array&&!v.length)){continue;}v.constructor==Array?$.merge(val,v):val.push(v);}return val;};$.fieldValue=function(el,_3f){var n=el.name,t=el.type,tag=el.tagName.toLowerCase();if(typeof _3f=="undefined"){_3f=true;}if(_3f&&(!n||el.disabled||t=="reset"||t=="button"||(t=="checkbox"||t=="radio")&&!el.checked||(t=="submit"||t=="image")&&el.form&&el.form.clk!=el||tag=="select"&&el.selectedIndex==-1)){return null;}if(tag=="select"){var _41=el.selectedIndex;if(_41<0){return null;}var a=[],ops=el.options;var one=(t=="select-one");var max=(one?_41+1:ops.length);for(var i=(one?_41:0);i<max;i++){var op=ops[i];if(op.selected){var v=$.browser.msie&&!(op.attributes["value"].specified)?op.text:op.value;if(one){return v;}a.push(v);}}return a;}return el.value;};$.fn.clearForm=function(){return this.each(function(){$("input,select,textarea",this).clearFields();});};$.fn.clearFields=$.fn.clearInputs=function(){return this.each(function(){var t=this.type,tag=this.tagName.toLowerCase();if(t=="text"||t=="password"||tag=="textarea"){this.value="";}else{if(t=="checkbox"||t=="radio"){this.checked=false;}else{if(tag=="select"){this.selectedIndex=-1;}}}});};$.fn.resetForm=function(){return this.each(function(){if(typeof this.reset=="function"||(typeof this.reset=="object"&&!this.reset.nodeType)){this.reset();}});};})(jQuery);
    35.5 \ No newline at end of file
    36.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    36.2 +++ b/web/support/javascript/form.js	Tue Oct 27 21:31:06 2009 -0700
    36.3 @@ -0,0 +1,819 @@
    36.4 +/*
    36.5 + * jQuery Form Plugin
    36.6 + * @requires jQuery v1.1 or later
    36.7 + *
    36.8 + * Examples at: http://malsup.com/jquery/form/
    36.9 + * Dual licensed under the MIT and GPL licenses:
   36.10 + *   http://www.opensource.org/licenses/mit-license.php
   36.11 + *   http://www.gnu.org/licenses/gpl.html
   36.12 + *
   36.13 + * Revision: $Id$
   36.14 + */
   36.15 + (function($) {
   36.16 +/**
   36.17 + * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
   36.18 + *
   36.19 + * ajaxSubmit accepts a single argument which can be either a success callback function
   36.20 + * or an options Object.  If a function is provided it will be invoked upon successful
   36.21 + * completion of the submit and will be passed the response from the server.
   36.22 + * If an options Object is provided, the following attributes are supported:
   36.23 + *
   36.24 + *  target:   Identifies the element(s) in the page to be updated with the server response.
   36.25 + *            This value may be specified as a jQuery selection string, a jQuery object,
   36.26 + *            or a DOM element.
   36.27 + *            default value: null
   36.28 + *
   36.29 + *  url:      URL to which the form data will be submitted.
   36.30 + *            default value: value of form's 'action' attribute
   36.31 + *
   36.32 + *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
   36.33 + *            default value: value of form's 'method' attribute (or 'GET' if none found)
   36.34 + *
   36.35 + *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
   36.36 + *
   36.37 + *  beforeSubmit:  Callback method to be invoked before the form is submitted.
   36.38 + *            default value: null
   36.39 + *
   36.40 + *  success:  Callback method to be invoked after the form has been successfully submitted
   36.41 + *            and the response has been returned from the server
   36.42 + *            default value: null
   36.43 + *
   36.44 + *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
   36.45 + *            default value: null
   36.46 + *
   36.47 + *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
   36.48 + *            default value: false
   36.49 + *
   36.50 + *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
   36.51 + *
   36.52 + *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
   36.53 + *
   36.54 + *
   36.55 + * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
   36.56 + * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
   36.57 + * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
   36.58 + * in array format, the jQuery object, and the options object passed into ajaxSubmit.
   36.59 + * The form data array takes the following form:
   36.60 + *
   36.61 + *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
   36.62 + *
   36.63 + * If a 'success' callback method is provided it is invoked after the response has been returned
   36.64 + * from the server.  It is passed the responseText or responseXML value (depending on dataType).
   36.65 + * See jQuery.ajax for further details.
   36.66 + *
   36.67 + *
   36.68 + * The dataType option provides a means for specifying how the server response should be handled.
   36.69 + * This maps directly to the jQuery.httpData method.  The following values are supported:
   36.70 + *
   36.71 + *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
   36.72 + *                   callback method, if specified, will be passed the responseXML value
   36.73 + *      'json':   if dataType == 'json' the server response will be evaluted and passed to
   36.74 + *                   the 'success' callback, if specified
   36.75 + *      'script': if dataType == 'script' the server response is evaluated in the global context
   36.76 + *
   36.77 + *
   36.78 + * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
   36.79 + * are provided the target will be ignored.
   36.80 + *
   36.81 + * The semantic argument can be used to force form serialization in semantic order.
   36.82 + * This is normally true anyway, unless the form contains input elements of type='image'.
   36.83 + * If your form must be submitted with name/value pairs in semantic order and your form
   36.84 + * contains an input of type='image" then pass true for this arg, otherwise pass false
   36.85 + * (or nothing) to avoid the overhead for this logic.
   36.86 + *
   36.87 + *
   36.88 + * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
   36.89 + *
   36.90 + * $("#form-id").submit(function() {
   36.91 + *     $(this).ajaxSubmit(options);
   36.92 + *     return false; // cancel conventional submit
   36.93 + * });
   36.94 + *
   36.95 + * When using ajaxForm(), however, this is done for you.
   36.96 + *
   36.97 + * @example
   36.98 + * $('#myForm').ajaxSubmit(function(data) {
   36.99 + *     alert('Form submit succeeded! Server returned: ' + data);
  36.100 + * });
  36.101 + * @desc Submit form and alert server response
  36.102 + *
  36.103 + *
  36.104 + * @example
  36.105 + * var options = {
  36.106 + *     target: '#myTargetDiv'
  36.107 + * };
  36.108 + * $('#myForm').ajaxSubmit(options);
  36.109 + * @desc Submit form and update page element with server response
  36.110 + *
  36.111 + *
  36.112 + * @example
  36.113 + * var options = {
  36.114 + *     success: function(responseText) {
  36.115 + *         alert(responseText);
  36.116 + *     }
  36.117 + * };
  36.118 + * $('#myForm').ajaxSubmit(options);
  36.119 + * @desc Submit form and alert the server response
  36.120 + *
  36.121 + *
  36.122 + * @example
  36.123 + * var options = {
  36.124 + *     beforeSubmit: function(formArray, jqForm) {
  36.125 + *         if (formArray.length == 0) {
  36.126 + *             alert('Please enter data.');
  36.127 + *             return false;
  36.128 + *         }
  36.129 + *     }
  36.130 + * };
  36.131 + * $('#myForm').ajaxSubmit(options);
  36.132 + * @desc Pre-submit validation which aborts the submit operation if form data is empty
  36.133 + *
  36.134 + *
  36.135 + * @example
  36.136 + * var options = {
  36.137 + *     url: myJsonUrl.php,
  36.138 + *     dataType: 'json',
  36.139 + *     success: function(data) {
  36.140 + *        // 'data' is an object representing the the evaluated json data
  36.141 + *     }
  36.142 + * };
  36.143 + * $('#myForm').ajaxSubmit(options);
  36.144 + * @desc json data returned and evaluated
  36.145 + *
  36.146 + *
  36.147 + * @example
  36.148 + * var options = {
  36.149 + *     url: myXmlUrl.php,
  36.150 + *     dataType: 'xml',
  36.151 + *     success: function(responseXML) {
  36.152 + *        // responseXML is XML document object
  36.153 + *        var data = $('myElement', responseXML).text();
  36.154 + *     }
  36.155 + * };
  36.156 + * $('#myForm').ajaxSubmit(options);
  36.157 + * @desc XML data returned from server
  36.158 + *
  36.159 + *
  36.160 + * @example
  36.161 + * var options = {
  36.162 + *     resetForm: true
  36.163 + * };
  36.164 + * $('#myForm').ajaxSubmit(options);
  36.165 + * @desc submit form and reset it if successful
  36.166 + *
  36.167 + * @example
  36.168 + * $('#myForm).submit(function() {
  36.169 + *    $(this).ajaxSubmit();
  36.170 + *    return false;
  36.171 + * });
  36.172 + * @desc Bind form's submit event to use ajaxSubmit
  36.173 + *
  36.174 + *
  36.175 + * @name ajaxSubmit
  36.176 + * @type jQuery
  36.177 + * @param options  object literal containing options which control the form submission process
  36.178 + * @cat Plugins/Form
  36.179 + * @return jQuery
  36.180 + */
  36.181 +$.fn.ajaxSubmit = function(options) {
  36.182 +    if (typeof options == 'function')
  36.183 +        options = { success: options };
  36.184 +
  36.185 +    options = $.extend({
  36.186 +        url:  this.attr('action') || window.location,
  36.187 +        type: this.attr('method') || 'GET'
  36.188 +    }, options || {});
  36.189 +
  36.190 +    // hook for manipulating the form data before it is extracted;
  36.191 +    // convenient for use with rich editors like tinyMCE or FCKEditor
  36.192 +    var veto = {};
  36.193 +    $.event.trigger('form.pre.serialize', [this, options, veto]);
  36.194 +    if (veto.veto) return this;
  36.195 +
  36.196 +    var a = this.formToArray(options.semantic);
  36.197 +	if (options.data) {
  36.198 +	    for (var n in options.data)
  36.199 +	        a.push( { name: n, value: options.data[n] } );
  36.200 +	}
  36.201 +
  36.202 +    // give pre-submit callback an opportunity to abort the submit
  36.203 +    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
  36.204 +
  36.205 +    // fire vetoable 'validate' event
  36.206 +    $.event.trigger('form.submit.validate', [a, this, options, veto]);
  36.207 +    if (veto.veto) return this;
  36.208 +
  36.209 +    var q = $.param(a);//.replace(/%20/g,'+');
  36.210 +
  36.211 +    if (options.type.toUpperCase() == 'GET') {
  36.212 +        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
  36.213 +        options.data = null;  // data is null for 'get'
  36.214 +    }
  36.215 +    else
  36.216 +        options.data = q; // data is the query string for 'post'
  36.217 +
  36.218 +    var $form = this, callbacks = [];
  36.219 +    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
  36.220 +    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
  36.221 +
  36.222 +    // perform a load on the target only if dataType is not provided
  36.223 +    if (!options.dataType && options.target) {
  36.224 +        var oldSuccess = options.success || function(){};
  36.225 +        callbacks.push(function(data) {
  36.226 +            if (this.evalScripts)
  36.227 +                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
  36.228 +            else // jQuery v1.1.4
  36.229 +                $(options.target).html(data).each(oldSuccess, arguments);
  36.230 +        });
  36.231 +    }
  36.232 +    else if (options.success)
  36.233 +        callbacks.push(options.success);
  36.234 +
  36.235 +    options.success = function(data, status) {
  36.236 +        for (var i=0, max=callbacks.length; i < max; i++)
  36.237 +            callbacks[i](data, status, $form);
  36.238 +    };
  36.239 +
  36.240 +    // are there files to upload?
  36.241 +    var files = $('input:file', this).fieldValue();
  36.242 +    var found = false;
  36.243 +    for (var j=0; j < files.length; j++)
  36.244 +        if (files[j])
  36.245 +            found = true;
  36.246 +
  36.247 +    if (options.iframe || found) // options.iframe allows user to force iframe mode
  36.248 +        fileUpload();
  36.249 +    else
  36.250 +        $.ajax(options);
  36.251 +
  36.252 +    // fire 'notify' event
  36.253 +    $.event.trigger('form.submit.notify', [this, options]);
  36.254 +    return this;
  36.255 +
  36.256 +
  36.257 +    // private function for handling file uploads (hat tip to YAHOO!)
  36.258 +    function fileUpload() {
  36.259 +        var form = $form[0];
  36.260 +        var opts = $.extend({}, $.ajaxSettings, options);
  36.261 +
  36.262 +        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
  36.263 +        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
  36.264 +        var io = $io[0];
  36.265 +        var op8 = $.browser.opera && window.opera.version() < 9;
  36.266 +        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
  36.267 +        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
  36.268 +
  36.269 +        var xhr = { // mock object
  36.270 +            responseText: null,
  36.271 +            responseXML: null,
  36.272 +            status: 0,
  36.273 +            statusText: 'n/a',
  36.274 +            getAllResponseHeaders: function() {},
  36.275 +            getResponseHeader: function() {},
  36.276 +            setRequestHeader: function() {}
  36.277 +        };
  36.278 +
  36.279 +        var g = opts.global;
  36.280 +        // trigger ajax global events so that activity/block indicators work like normal
  36.281 +        if (g && ! $.active++) $.event.trigger("ajaxStart");
  36.282 +        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
  36.283 +
  36.284 +        var cbInvoked = 0;
  36.285 +        var timedOut = 0;
  36.286 +
  36.287 +        // take a breath so that pending repaints get some cpu time before the upload starts
  36.288 +        setTimeout(function() {
  36.289 +            $io.appendTo('body');
  36.290 +            // jQuery's event binding doesn't work for iframe events in IE
  36.291 +            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
  36.292 +
  36.293 +            // make sure form attrs are set
  36.294 +            var encAttr = form.encoding ? 'encoding' : 'enctype';
  36.295 +            var t = $form.attr('target');
  36.296 +            $form.attr({
  36.297 +                target:   id,
  36.298 +                method:  'POST',
  36.299 +                action:   opts.url
  36.300 +            });
  36.301 +            form[encAttr] = 'multipart/form-data';
  36.302 +
  36.303 +            // support timout
  36.304 +            if (opts.timeout)
  36.305 +                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
  36.306 +
  36.307 +            form.submit();
  36.308 +            $form.attr('target', t); // reset target
  36.309 +        }, 10);
  36.310 +
  36.311 +        function cb() {
  36.312 +            if (cbInvoked++) return;
  36.313 +
  36.314 +            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
  36.315 +
  36.316 +            var ok = true;
  36.317 +            try {
  36.318 +                if (timedOut) throw 'timeout';
  36.319 +                // extract the server response from the iframe
  36.320 +                var data, doc;
  36.321 +                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
  36.322 +                xhr.responseText = doc.body ? doc.body.innerHTML : null;
  36.323 +                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
  36.324 +
  36.325 +                if (opts.dataType == 'json' || opts.dataType == 'script') {
  36.326 +                    var ta = doc.getElementsByTagName('textarea')[0];
  36.327 +                    data = ta ? ta.value : xhr.responseText;
  36.328 +                    if (opts.dataType == 'json')
  36.329 +                        eval("data = " + data);
  36.330 +                    else
  36.331 +                        $.globalEval(data);
  36.332 +                }
  36.333 +                else if (opts.dataType == 'xml') {
  36.334 +                    data = xhr.responseXML;
  36.335 +                    if (!data && xhr.responseText != null)
  36.336 +                        data = toXml(xhr.responseText);
  36.337 +                }
  36.338 +                else {
  36.339 +                    data = xhr.responseText;
  36.340 +                }
  36.341 +            }
  36.342 +            catch(e){
  36.343 +                ok = false;
  36.344 +                $.handleError(opts, xhr, 'error', e);
  36.345 +            }
  36.346 +
  36.347 +            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
  36.348 +            if (ok) {
  36.349 +                opts.success(data, 'success');
  36.350 +                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
  36.351 +            }
  36.352 +            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
  36.353 +            if (g && ! --$.active) $.event.trigger("ajaxStop");
  36.354 +            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
  36.355 +
  36.356 +            // clean up
  36.357 +            setTimeout(function() {
  36.358 +                $io.remove();
  36.359 +                xhr.responseXML = null;
  36.360 +            }, 100);
  36.361 +        };
  36.362 +
  36.363 +        function toXml(s, doc) {
  36.364 +            if (window.ActiveXObject) {
  36.365 +                doc = new ActiveXObject('Microsoft.XMLDOM');
  36.366 +                doc.async = 'false';
  36.367 +                doc.loadXML(s);
  36.368 +            }
  36.369 +            else
  36.370 +                doc = (new DOMParser()).parseFromString(s, 'text/xml');
  36.371 +            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
  36.372 +        };
  36.373 +    };
  36.374 +};
  36.375 +$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
  36.376 +
  36.377 +/**
  36.378 + * ajaxForm() provides a mechanism for fully automating form submission.
  36.379 + *
  36.380 + * The advantages of using this method instead of ajaxSubmit() are:
  36.381 + *
  36.382 + * 1: This method will include coordinates for <input type="image" /> elements (if the element
  36.383 + *    is used to submit the form).
  36.384 + * 2. This method will include the submit element's name/value data (for the element that was
  36.385 + *    used to submit the form).
  36.386 + * 3. This method binds the submit() method to the form for you.
  36.387 + *
  36.388 + * Note that for accurate x/y coordinates of image submit elements in all browsers
  36.389 + * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
  36.390 + *
  36.391 + * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
  36.392 + * passes the options argument along after properly binding events for submit elements and
  36.393 + * the form itself.  See ajaxSubmit for a full description of the options argument.
  36.394 + *
  36.395 + *
  36.396 + * @example
  36.397 + * var options = {
  36.398 + *     target: '#myTargetDiv'
  36.399 + * };
  36.400 + * $('#myForm').ajaxSForm(options);
  36.401 + * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
  36.402 + *       when the form is submitted.
  36.403 + *
  36.404 + *
  36.405 + * @example
  36.406 + * var options = {
  36.407 + *     success: function(responseText) {
  36.408 + *         alert(responseText);
  36.409 + *     }
  36.410 + * };
  36.411 + * $('#myForm').ajaxSubmit(options);
  36.412 + * @desc Bind form's submit event so that server response is alerted after the form is submitted.
  36.413 + *
  36.414 + *
  36.415 + * @example
  36.416 + * var options = {
  36.417 + *     beforeSubmit: function(formArray, jqForm) {
  36.418 + *         if (formArray.length == 0) {
  36.419 + *             alert('Please enter data.');
  36.420 + *             return false;
  36.421 + *         }
  36.422 + *     }
  36.423 + * };
  36.424 + * $('#myForm').ajaxSubmit(options);
  36.425 + * @desc Bind form's submit event so that pre-submit callback is invoked before the form
  36.426 + *       is submitted.
  36.427 + *
  36.428 + *
  36.429 + * @name   ajaxForm
  36.430 + * @param  options  object literal containing options which control the form submission process
  36.431 + * @return jQuery
  36.432 + * @cat    Plugins/Form
  36.433 + * @type   jQuery
  36.434 + */
  36.435 +$.fn.ajaxForm = function(options) {
  36.436 +    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
  36.437 +        // store options in hash
  36.438 +        this.formPluginId = $.fn.ajaxForm.counter++;
  36.439 +        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
  36.440 +        $(":submit,input:image", this).click(clickHandler);
  36.441 +    });
  36.442 +};
  36.443 +
  36.444 +$.fn.ajaxForm.counter = 1;
  36.445 +$.fn.ajaxForm.optionHash = {};
  36.446 +
  36.447 +function clickHandler(e) {
  36.448 +    var $form = this.form;
  36.449 +    $form.clk = this;
  36.450 +    if (this.type == 'image') {
  36.451 +        if (e.offsetX != undefined) {
  36.452 +            $form.clk_x = e.offsetX;
  36.453 +            $form.clk_y = e.offsetY;
  36.454 +        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
  36.455 +            var offset = $(this).offset();
  36.456 +            $form.clk_x = e.pageX - offset.left;
  36.457 +            $form.clk_y = e.pageY - offset.top;
  36.458 +        } else {
  36.459 +            $form.clk_x = e.pageX - this.offsetLeft;
  36.460 +            $form.clk_y = e.pageY - this.offsetTop;
  36.461 +        }
  36.462 +    }
  36.463 +    // clear form vars
  36.464 +    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
  36.465 +};
  36.466 +
  36.467 +function submitHandler() {
  36.468 +    // retrieve options from hash
  36.469 +    var id = this.formPluginId;
  36.470 +    var options = $.fn.ajaxForm.optionHash[id];
  36.471 +    $(this).ajaxSubmit(options);
  36.472 +    return false;
  36.473 +};
  36.474 +
  36.475 +/**
  36.476 + * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
  36.477 + *
  36.478 + * @name   ajaxFormUnbind
  36.479 + * @return jQuery
  36.480 + * @cat    Plugins/Form
  36.481 + * @type   jQuery
  36.482 + */
  36.483 +$.fn.ajaxFormUnbind = function() {
  36.484 +    this.unbind('submit', submitHandler);
  36.485 +    return this.each(function() {
  36.486 +        $(":submit,input:image", this).unbind('click', clickHandler);
  36.487 +    });
  36.488 +
  36.489 +};
  36.490 +
  36.491 +/**
  36.492 + * formToArray() gathers form element data into an array of objects that can
  36.493 + * be passed to any of the following ajax functions: $.get, $.post, or load.
  36.494 + * Each object in the array has both a 'name' and 'value' property.  An example of
  36.495 + * an array for a simple login form might be:
  36.496 + *
  36.497 + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  36.498 + *
  36.499 + * It is this array that is passed to pre-submit callback functions provided to the
  36.500 + * ajaxSubmit() and ajaxForm() methods.
  36.501 + *
  36.502 + * The semantic argument can be used to force form serialization in semantic order.
  36.503 + * This is normally true anyway, unless the form contains input elements of type='image'.
  36.504 + * If your form must be submitted with name/value pairs in semantic order and your form
  36.505 + * contains an input of type='image" then pass true for this arg, otherwise pass false
  36.506 + * (or nothing) to avoid the overhead for this logic.
  36.507 + *
  36.508 + * @example var data = $("#myForm").formToArray();
  36.509 + * $.post( "myscript.cgi", data );
  36.510 + * @desc Collect all the data from a form and submit it to the server.
  36.511 + *
  36.512 + * @name formToArray
  36.513 + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  36.514 + * @type Array<Object>
  36.515 + * @cat Plugins/Form
  36.516 + */
  36.517 +$.fn.formToArray = function(semantic) {
  36.518 +    var a = [];
  36.519 +    if (this.length == 0) return a;
  36.520 +
  36.521 +    var form = this[0];
  36.522 +    var els = semantic ? form.getElementsByTagName('*') : form.elements;
  36.523 +    if (!els) return a;
  36.524 +    for(var i=0, max=els.length; i < max; i++) {
  36.525 +        var el = els[i];
  36.526 +        var n = el.name;
  36.527 +        if (!n) continue;
  36.528 +
  36.529 +        if (semantic && form.clk && el.type == "image") {
  36.530 +            // handle image inputs on the fly when semantic == true
  36.531 +            if(!el.disabled && form.clk == el)
  36.532 +                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  36.533 +            continue;
  36.534 +        }
  36.535 +
  36.536 +        var v = $.fieldValue(el, true);
  36.537 +        if (v && v.constructor == Array) {
  36.538 +            for(var j=0, jmax=v.length; j < jmax; j++)
  36.539 +                a.push({name: n, value: v[j]});
  36.540 +        }
  36.541 +        else if (v !== null && typeof v != 'undefined')
  36.542 +            a.push({name: n, value: v});
  36.543 +    }
  36.544 +
  36.545 +    if (!semantic && form.clk) {
  36.546 +        // input type=='image' are not found in elements array! handle them here
  36.547 +        var inputs = form.getElementsByTagName("input");
  36.548 +        for(var i=0, max=inputs.length; i < max; i++) {
  36.549 +            var input = inputs[i];
  36.550 +            var n = input.name;
  36.551 +            if(n && !input.disabled && input.type == "image" && form.clk == input)
  36.552 +                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  36.553 +        }
  36.554 +    }
  36.555 +    return a;
  36.556 +};
  36.557 +
  36.558 +
  36.559 +/**
  36.560 + * Serializes form data into a 'submittable' string. This method will return a string
  36.561 + * in the format: name1=value1&amp;name2=value2
  36.562 + *
  36.563 + * The semantic argument can be used to force form serialization in semantic order.
  36.564 + * If your form must be submitted with name/value pairs in semantic order then pass
  36.565 + * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
  36.566 + * this logic (which can be significant for very large forms).
  36.567 + *
  36.568 + * @example var data = $("#myForm").formSerialize();
  36.569 + * $.ajax('POST', "myscript.cgi", data);
  36.570 + * @desc Collect all the data from a form into a single string
  36.571 + *
  36.572 + * @name formSerialize
  36.573 + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  36.574 + * @type String
  36.575 + * @cat Plugins/Form
  36.576 + */
  36.577 +$.fn.formSerialize = function(semantic) {
  36.578 +    //hand off to jQuery.param for proper encoding
  36.579 +    return $.param(this.formToArray(semantic));
  36.580 +};
  36.581 +
  36.582 +
  36.583 +/**
  36.584 + * Serializes all field elements in the jQuery object into a query string.
  36.585 + * This method will return a string in the format: name1=value1&amp;name2=value2
  36.586 + *
  36.587 + * The successful argument controls whether or not serialization is limited to
  36.588 + * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  36.589 + * The default value of the successful argument is true.
  36.590 + *
  36.591 + * @example var data = $("input").formSerialize();
  36.592 + * @desc Collect the data from all successful input elements into a query string
  36.593 + *
  36.594 + * @example var data = $(":radio").formSerialize();
  36.595 + * @desc Collect the data from all successful radio input elements into a query string
  36.596 + *
  36.597 + * @example var data = $("#myForm :checkbox").formSerialize();
  36.598 + * @desc Collect the data from all successful checkbox input elements in myForm into a query string
  36.599 + *
  36.600 + * @example var data = $("#myForm :checkbox").formSerialize(false);
  36.601 + * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
  36.602 + *
  36.603 + * @example var data = $(":input").formSerialize();
  36.604 + * @desc Collect the data from all successful input, select, textarea and button elements into a query string
  36.605 + *
  36.606 + * @name fieldSerialize
  36.607 + * @param successful true if only successful controls should be serialized (default is true)
  36.608 + * @type String
  36.609 + * @cat Plugins/Form
  36.610 + */
  36.611 +$.fn.fieldSerialize = function(successful) {
  36.612 +    var a = [];
  36.613 +    this.each(function() {
  36.614 +        var n = this.name;
  36.615 +        if (!n) return;
  36.616 +        var v = $.fieldValue(this, successful);
  36.617 +        if (v && v.constructor == Array) {
  36.618 +            for (var i=0,max=v.length; i < max; i++)
  36.619 +                a.push({name: n, value: v[i]});
  36.620 +        }
  36.621 +        else if (v !== null && typeof v != 'undefined')
  36.622 +            a.push({name: this.name, value: v});
  36.623 +    });
  36.624 +    //hand off to jQuery.param for proper encoding
  36.625 +    return $.param(a);
  36.626 +};
  36.627 +
  36.628 +
  36.629 +/**
  36.630 + * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  36.631 + *
  36.632 + *  <form><fieldset>
  36.633 + *      <input name="A" type="text" />
  36.634 + *      <input name="A" type="text" />
  36.635 + *      <input name="B" type="checkbox" value="B1" />
  36.636 + *      <input name="B" type="checkbox" value="B2"/>
  36.637 + *      <input name="C" type="radio" value="C1" />
  36.638 + *      <input name="C" type="radio" value="C2" />
  36.639 + *  </fieldset></form>
  36.640 + *
  36.641 + *  var v = $(':text').fieldValue();
  36.642 + *  // if no values are entered into the text inputs
  36.643 + *  v == ['','']
  36.644 + *  // if values entered into the text inputs are 'foo' and 'bar'
  36.645 + *  v == ['foo','bar']
  36.646 + *
  36.647 + *  var v = $(':checkbox').fieldValue();
  36.648 + *  // if neither checkbox is checked
  36.649 + *  v === undefined
  36.650 + *  // if both checkboxes are checked
  36.651 + *  v == ['B1', 'B2']
  36.652 + *
  36.653 + *  var v = $(':radio').fieldValue();
  36.654 + *  // if neither radio is checked
  36.655 + *  v === undefined
  36.656 + *  // if first radio is checked
  36.657 + *  v == ['C1']
  36.658 + *
  36.659 + * The successful argument controls whether or not the field element must be 'successful'
  36.660 + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  36.661 + * The default value of the successful argument is true.  If this value is false the value(s)
  36.662 + * for each element is returned.
  36.663 + *
  36.664 + * Note: This method *always* returns an array.  If no valid value can be determined the
  36.665 + *       array will be empty, otherwise it will contain one or more values.
  36.666 + *
  36.667 + * @example var data = $("#myPasswordElement").fieldValue();
  36.668 + * alert(data[0]);
  36.669 + * @desc Alerts the current value of the myPasswordElement element
  36.670 + *
  36.671 + * @example var data = $("#myForm :input").fieldValue();
  36.672 + * @desc Get the value(s) of the form elements in myForm
  36.673 + *
  36.674 + * @example var data = $("#myForm :checkbox").fieldValue();
  36.675 + * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
  36.676 + *
  36.677 + * @example var data = $("#mySingleSelect").fieldValue();
  36.678 + * @desc Get the value(s) of the select control
  36.679 + *
  36.680 + * @example var data = $(':text').fieldValue();
  36.681 + * @desc Get the value(s) of the text input or textarea elements
  36.682 + *
  36.683 + * @example var data = $("#myMultiSelect").fieldValue();
  36.684 + * @desc Get the values for the select-multiple control
  36.685 + *
  36.686 + * @name fieldValue
  36.687 + * @param Boolean successful true if only the values for successful controls should be returned (default is true)
  36.688 + * @type Array<String>
  36.689 + * @cat Plugins/Form
  36.690 + */
  36.691 +$.fn.fieldValue = function(successful) {
  36.692 +    for (var val=[], i=0, max=this.length; i < max; i++) {
  36.693 +        var el = this[i];
  36.694 +        var v = $.fieldValue(el, successful);
  36.695 +        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
  36.696 +            continue;
  36.697 +        v.constructor == Array ? $.merge(val, v) : val.push(v);
  36.698 +    }
  36.699 +    return val;
  36.700 +};
  36.701 +
  36.702 +/**
  36.703 + * Returns the value of the field element.
  36.704 + *
  36.705 + * The successful argument controls whether or not the field element must be 'successful'
  36.706 + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  36.707 + * The default value of the successful argument is true.  If the given element is not
  36.708 + * successful and the successful arg is not false then the returned value will be null.
  36.709 + *
  36.710 + * Note: If the successful flag is true (default) but the element is not successful, the return will be null
  36.711 + * Note: The value returned for a successful select-multiple element will always be an array.
  36.712 + * Note: If the element has no value the return value will be undefined.
  36.713 + *
  36.714 + * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
  36.715 + * @desc Gets the current value of the myPasswordElement element
  36.716 + *
  36.717 + * @name fieldValue
  36.718 + * @param Element el The DOM element for which the value will be returned
  36.719 + * @param Boolean successful true if value returned must be for a successful controls (default is true)
  36.720 + * @type String or Array<String> or null or undefined
  36.721 + * @cat Plugins/Form
  36.722 + */
  36.723 +$.fieldValue = function(el, successful) {
  36.724 +    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
  36.725 +    if (typeof successful == 'undefined') successful = true;
  36.726 +
  36.727 +    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
  36.728 +        (t == 'checkbox' || t == 'radio') && !el.checked ||
  36.729 +        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
  36.730 +        tag == 'select' && el.selectedIndex == -1))
  36.731 +            return null;
  36.732 +
  36.733 +    if (tag == 'select') {
  36.734 +        var index = el.selectedIndex;
  36.735 +        if (index < 0) return null;
  36.736 +        var a = [], ops = el.options;
  36.737 +        var one = (t == 'select-one');
  36.738 +        var max = (one ? index+1 : ops.length);
  36.739 +        for(var i=(one ? index : 0); i < max; i++) {
  36.740 +            var op = ops[i];
  36.741 +            if (op.selected) {
  36.742 +                // extra pain for IE...
  36.743 +                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
  36.744 +                if (one) return v;
  36.745 +                a.push(v);
  36.746 +            }
  36.747 +        }
  36.748 +        return a;
  36.749 +    }
  36.750 +    return el.value;
  36.751 +};
  36.752 +
  36.753 +
  36.754 +/**
  36.755 + * Clears the form data.  Takes the following actions on the form's input fields:
  36.756 + *  - input text fields will have their 'value' property set to the empty string
  36.757 + *  - select elements will have their 'selectedIndex' property set to -1
  36.758 + *  - checkbox and radio inputs will have their 'checked' property set to false
  36.759 + *  - inputs of type submit, button, reset, and hidden will *not* be effected
  36.760 + *  - button elements will *not* be effected
  36.761 + *
  36.762 + * @example $('form').clearForm();
  36.763 + * @desc Clears all forms on the page.
  36.764 + *
  36.765 + * @name clearForm
  36.766 + * @type jQuery
  36.767 + * @cat Plugins/Form
  36.768 + */
  36.769 +$.fn.clearForm = function() {
  36.770 +    return this.each(function() {
  36.771 +        $('input,select,textarea', this).clearFields();
  36.772 +    });
  36.773 +};
  36.774 +
  36.775 +/**
  36.776 + * Clears the selected form elements.  Takes the following actions on the matched elements:
  36.777 + *  - input text fields will have their 'value' property set to the empty string
  36.778 + *  - select elements will have their 'selectedIndex' property set to -1
  36.779 + *  - checkbox and radio inputs will have their 'checked' property set to false
  36.780 + *  - inputs of type submit, button, reset, and hidden will *not* be effected
  36.781 + *  - button elements will *not* be effected
  36.782 + *
  36.783 + * @example $('.myInputs').clearFields();
  36.784 + * @desc Clears all inputs with class myInputs
  36.785 + *
  36.786 + * @name clearFields
  36.787 + * @type jQuery
  36.788 + * @cat Plugins/Form
  36.789 + */
  36.790 +$.fn.clearFields = $.fn.clearInputs = function() {
  36.791 +    return this.each(function() {
  36.792 +        var t = this.type, tag = this.tagName.toLowerCase();
  36.793 +        if (t == 'text' || t == 'password' || tag == 'textarea')
  36.794 +            this.value = '';
  36.795 +        else if (t == 'checkbox' || t == 'radio')
  36.796 +            this.checked = false;
  36.797 +        else if (tag == 'select')
  36.798 +            this.selectedIndex = -1;
  36.799 +    });
  36.800 +};
  36.801 +
  36.802 +
  36.803 +/**
  36.804 + * Resets the form data.  Causes all form elements to be reset to their original value.
  36.805 + *
  36.806 + * @example $('form').resetForm();
  36.807 + * @desc Resets all forms on the page.
  36.808 + *
  36.809 + * @name resetForm
  36.810 + * @type jQuery
  36.811 + * @cat Plugins/Form
  36.812 + */
  36.813 +$.fn.resetForm = function() {
  36.814 +    return this.each(function() {
  36.815 +        // guard against an input with the name of 'reset'
  36.816 +        // note that IE reports the reset function as an 'object'
  36.817 +        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
  36.818 +            this.reset();
  36.819 +    });
  36.820 +};
  36.821 +
  36.822 +})(jQuery);
    37.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    37.2 +++ b/web/support/javascript/hsbook.js	Tue Oct 27 21:31:06 2009 -0700
    37.3 @@ -0,0 +1,95 @@
    37.4 +function qid(id) {
    37.5 +  return id.replace(/([.:])/g, "\\$1");
    37.6 +}
    37.7 +
    37.8 +function beforeComment(formData, jqForm, options) {
    37.9 +  var form = jqForm[0];
   37.10 +  if (!form.comment.value) {
   37.11 +    $(options.target + " span.comment_error").empty().append(
   37.12 +      "<span class=\"comment_error\">Your comment is empty</span>");
   37.13 +    return false;
   37.14 +  }
   37.15 +  if (!form.name.value) {
   37.16 +    $(options.target + " span.comment_error").empty().append(
   37.17 +      "<span class=\"comment_error\">Please provide a name</span>");
   37.18 +    return false;
   37.19 +  }
   37.20 +  $(options.target + " span.comment_error").empty().after(
   37.21 +    "<img src=\"/support/icons/throbber.gif\" style=\"vertical-align: middle\"/>");
   37.22 +  $(options.target + " input[@name=submit]").attr("disabled", true);
   37.23 +}
   37.24 +
   37.25 +function ajaxifyForm(id) {
   37.26 +  var q = qid(id);
   37.27 +  
   37.28 +  $("#form_" + q).ajaxForm({ beforeSubmit: beforeComment,
   37.29 +			     success: function() { ajaxifyForm(id); },
   37.30 +			     target: "#comments_" + q });
   37.31 +}
   37.32 +
   37.33 +function toggleComment(id) {
   37.34 +  $("#toggle_" + qid(id)).nextAll().toggle();
   37.35 +  return false;
   37.36 +}
   37.37 +
   37.38 +function loadComments(id) {
   37.39 +  $("#comments_" + qid(id)).load(location.protocol + "//" + location.host +
   37.40 +				 "/comments/single/" + id + "/", function() {
   37.41 +    ajaxifyForm(id);
   37.42 +  });
   37.43 +  return false;
   37.44 +}
   37.45 +
   37.46 +function loadAllComments() {
   37.47 +  $("a.commenttoggle").each(function() {
   37.48 +    var id = $(this).attr("pid");
   37.49 +    if (id) {
   37.50 +      loadComments(id);
   37.51 +    }
   37.52 +  });
   37.53 +}
   37.54 +
   37.55 +$(document).ready(function() {
   37.56 +  function loading(id) {
   37.57 +    return " <span id=\"comments_" + id + "\" class=\"comment\">" +
   37.58 +      "<span pid=\"" + id + "\" class=\"commenttoggle\">Loading..." +
   37.59 +      "</span></span>";
   37.60 +  }
   37.61 +  $("div.toc>p")
   37.62 +    .after("<p style='display: none;'><a onclick='return loadAllComments()'>" +
   37.63 +	   "Load all comments (<b>slow</b>)</a></p>")
   37.64 +    .toggle(function() { $(this).nextAll().show("normal"); },
   37.65 +	    function() { $(this).nextAll().hide("normal"); })
   37.66 +    .hover(function() { $(this).fadeTo("normal", 0.8); },
   37.67 +	   function() { $(this).fadeTo("normal", 0.35); });
   37.68 +  $(".chapter p[@id]").each(function() {
   37.69 +    $(this).append(loading($(this).attr("id")));
   37.70 +  });
   37.71 +  $(".chapter table[@id].equation").each(function() {
   37.72 +    id = $(this).attr("id");
   37.73 +    $("#" + id + " tr").after('<tr><td colspan="4">' + loading($(this).attr("id")) + '</td></tr>');
   37.74 +  });
   37.75 +  $(".chapter pre[@id]").each(function() {
   37.76 +    $(this).after(loading($(this).attr("id")));
   37.77 +  });
   37.78 +  var chapid = $("div.preface, div.chapter, div.appendix, div.bibliography").attr("id");
   37.79 +  $("#chapterfeed").attr("href",
   37.80 +			 $("#chapterfeed").attr("href") + chapid + "/");
   37.81 +  $.getJSON(location.protocol + "//" + location.host + "/comments/chapter/" +
   37.82 +	    chapid + "/count/", function(data) {
   37.83 +    $.each(data, function(id, item) {
   37.84 +      var s = item == 1 ? "" : "s";
   37.85 +      $("#comments_" + qid(id) + " span.commenttoggle").replaceWith(
   37.86 +        "<a class='commenttoggle' id='toggle_" + id + "' " +
   37.87 +	"pid='" + id + "' " +
   37.88 +	"onclick='return loadComments(\"" + id + "\")' " +
   37.89 +	"href='comments: show / hide'>" + item + " comment" + s + "</a>");
   37.90 +    });
   37.91 +    $("span.commenttoggle").each(function() {
   37.92 +      var id = $(this).attr("pid");
   37.93 +      $(this).replaceWith("<a class='commenttoggle' id='toggle_" + id + "' " +
   37.94 +			  "onclick='return loadComments(\"" + id + "\")' " +
   37.95 +			  "href='comment: add'>No comments</a>");
   37.96 +    });
   37.97 +  });
   37.98 +});
    38.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    38.2 +++ b/web/support/javascript/jquery-min.js	Tue Oct 27 21:31:06 2009 -0700
    38.3 @@ -0,0 +1,31 @@
    38.4 +/*
    38.5 + * jQuery 1.2.1 - New Wave Javascript
    38.6 + *
    38.7 + * Copyright (c) 2007 John Resig (jquery.com)
    38.8 + * Dual licensed under the MIT (MIT-LICENSE.txt)
    38.9 + * and GPL (GPL-LICENSE.txt) licenses.
   38.10 + *
   38.11 + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   38.12 + * $Rev: 3353 $
   38.13 + */
   38.14 +(function(){if(typeof jQuery!="undefined")var _jQuery=jQuery;var jQuery=window.jQuery=function(selector,context){return this instanceof jQuery?this.init(selector,context):new jQuery(selector,context);};if(typeof $!="undefined")var _$=$;window.$=jQuery;var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(typeof selector=="string"){var m=quickExpr.exec(selector);if(m&&(m[1]||!context)){if(m[1])selector=jQuery.clean([m[1]],context);else{var tmp=document.getElementById(m[3]);if(tmp)if(tmp.id!=m[3])return jQuery().find(selector);else{this[0]=tmp;this.length=1;return this;}else
   38.15 +selector=[];}}else
   38.16 +return new jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return new jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(selector.constructor==Array&&selector||(selector.jquery||selector.length&&selector!=window&&!selector.nodeType&&selector[0]!=undefined&&selector[0].nodeType)&&jQuery.makeArray(selector)||[selector]);},jquery:"1.2.1",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(a){var ret=jQuery(a);ret.prevObject=this;return ret;},setArray:function(a){this.length=0;Array.prototype.push.apply(this,a);return this;},each:function(fn,args){return jQuery.each(this,fn,args);},index:function(obj){var pos=-1;this.each(function(i){if(this==obj)pos=i;});return pos;},attr:function(key,value,type){var obj=key;if(key.constructor==String)if(value==undefined)return this.length&&jQuery[type||"attr"](this[0],key)||undefined;else{obj={};obj[key]=value;}return this.each(function(index){for(var prop in obj)jQuery.attr(type?this.style:this,prop,jQuery.prop(this,obj[prop],type,index,prop));});},css:function(key,value){return this.attr(key,value,"curCSS");},text:function(e){if(typeof e!="object"&&e!=null)return this.empty().append(document.createTextNode(e));var t="";jQuery.each(e||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)t+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return t;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,1,function(a){this.appendChild(a);});},prepend:function(){return this.domManip(arguments,true,-1,function(a){this.insertBefore(a,this.firstChild);});},before:function(){return this.domManip(arguments,false,1,function(a){this.parentNode.insertBefore(a,this);});},after:function(){return this.domManip(arguments,false,-1,function(a){this.parentNode.insertBefore(a,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(t){var data=jQuery.map(this,function(a){return jQuery.find(t,a);});return this.pushStack(/[^+>] [^+>]/.test(t)||t.indexOf("..")>-1?jQuery.unique(data):data);},clone:function(events){var ret=this.map(function(){return this.outerHTML?jQuery(this.outerHTML)[0]:this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(t){return this.pushStack(jQuery.isFunction(t)&&jQuery.grep(this,function(el,index){return t.apply(el,[index]);})||jQuery.multiFilter(t,this));},not:function(t){return this.pushStack(t.constructor==String&&jQuery.multiFilter(t,this,true)||jQuery.grep(this,function(a){return(t.constructor==Array||t.jquery)?jQuery.inArray(a,t)<0:a!=t;}));},add:function(t){return this.pushStack(jQuery.merge(this.get(),t.constructor==String?jQuery(t).get():t.length!=undefined&&(!t.nodeName||jQuery.nodeName(t,"form"))?t:[t]));},is:function(expr){return expr?jQuery.multiFilter(expr,this).length>0:false;},hasClass:function(expr){return this.is("."+expr);},val:function(val){if(val==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,a=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){var val=jQuery.browser.msie&&!option.attributes["value"].specified?option.text:option.value;if(one)return val;a.push(val);}}return a;}else
   38.17 +return this[0].value.replace(/\r/g,"");}}else
   38.18 +return this.each(function(){if(val.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,val)>=0||jQuery.inArray(this.name,val)>=0);else if(jQuery.nodeName(this,"select")){var tmp=val.constructor==Array?val:[val];jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,tmp)>=0||jQuery.inArray(this.text,tmp)>=0);});if(!tmp.length)this.selectedIndex=-1;}else
   38.19 +this.value=val;});},html:function(val){return val==undefined?(this.length?this[0].innerHTML:null):this.empty().append(val);},replaceWith:function(val){return this.after(val).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(fn){return this.pushStack(jQuery.map(this,function(elem,i){return fn.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},domManip:function(args,table,dir,fn){var clone=this.length>1,a;return this.each(function(){if(!a){a=jQuery.clean(args,this.ownerDocument);if(dir<0)a.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(a[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(document.createElement("tbody"));jQuery.each(a,function(){var elem=clone?this.cloneNode(true):this;if(!evalScript(0,elem))fn.call(obj,elem);});});}};function evalScript(i,elem){var script=jQuery.nodeName(elem,"script");if(script){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
   38.20 +jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}else if(elem.nodeType==1)jQuery("script",elem).each(evalScript);return script;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},a=1,al=arguments.length,deep=false;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};}if(al==1){target=this;a=0;}var prop;for(;a<al;a++)if((prop=arguments[a])!=null)for(var i in prop){if(target==prop[i])continue;if(deep&&typeof prop[i]=='object'&&target[i])jQuery.extend(target[i],prop[i]);else if(prop[i]!=undefined)target[i]=prop[i];}return target;};var expando="jQuery"+(new Date()).getTime(),uuid=0,win={};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/function/i.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){if(window.execScript)window.execScript(data);else if(jQuery.browser.safari)window.setTimeout(data,0);else
   38.21 +eval.call(window,data);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?win:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!=undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?win:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(obj,fn,args){if(args){if(obj.length==undefined)for(var i in obj)fn.apply(obj[i],args);else
   38.22 +for(var i=0,ol=obj.length;i<ol;i++)if(fn.apply(obj[i],args)===false)break;}else{if(obj.length==undefined)for(var i in obj)fn.call(obj[i],i,obj[i]);else
   38.23 +for(var i=0,ol=obj.length,val=obj[0];i<ol&&fn.call(val,i,val)!==false;val=obj[++i]){}}return obj;},prop:function(elem,value,type,index,prop){if(jQuery.isFunction(value))value=value.call(elem,[index]);var exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i;return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(prop)?value+"px":value;},className:{add:function(elem,c){jQuery.each((c||"").split(/\s+/),function(i,cur){if(!jQuery.className.has(elem.className,cur))elem.className+=(elem.className?" ":"")+cur;});},remove:function(elem,c){elem.className=c!=undefined?jQuery.grep(elem.className.split(/\s+/),function(cur){return!jQuery.className.has(c,cur);}).join(" "):"";},has:function(t,c){return jQuery.inArray(c,(t.className||t).toString().split(/\s+/))>-1;}},swap:function(e,o,f){for(var i in o){e.style["old"+i]=e.style[i];e.style[i]=o[i];}f.apply(e,[]);for(var i in o)e.style[i]=e.style["old"+i];},css:function(e,p){if(p=="height"||p=="width"){var old={},oHeight,oWidth,d=["Top","Bottom","Right","Left"];jQuery.each(d,function(){old["padding"+this]=0;old["border"+this+"Width"]=0;});jQuery.swap(e,old,function(){if(jQuery(e).is(':visible')){oHeight=e.offsetHeight;oWidth=e.offsetWidth;}else{e=jQuery(e.cloneNode(true)).find(":radio").removeAttr("checked").end().css({visibility:"hidden",position:"absolute",display:"block",right:"0",left:"0"}).appendTo(e.parentNode)[0];var parPos=jQuery.css(e.parentNode,"position")||"static";if(parPos=="static")e.parentNode.style.position="relative";oHeight=e.clientHeight;oWidth=e.clientWidth;if(parPos=="static")e.parentNode.style.position="static";e.parentNode.removeChild(e);}});return p=="height"?oHeight:oWidth;}return jQuery.curCSS(e,p);},curCSS:function(elem,prop,force){var ret,stack=[],swap=[];function color(a){if(!jQuery.browser.safari)return false;var ret=document.defaultView.getComputedStyle(a,null);return!ret||ret.getPropertyValue("color")=="";}if(prop=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(elem.style,"opacity");return ret==""?"1":ret;}if(prop.match(/float/i))prop=styleFloat;if(!force&&elem.style[prop])ret=elem.style[prop];else if(document.defaultView&&document.defaultView.getComputedStyle){if(prop.match(/float/i))prop="float";prop=prop.replace(/([A-Z])/g,"-$1").toLowerCase();var cur=document.defaultView.getComputedStyle(elem,null);if(cur&&!color(elem))ret=cur.getPropertyValue(prop);else{for(var a=elem;a&&color(a);a=a.parentNode)stack.unshift(a);for(a=0;a<stack.length;a++)if(color(stack[a])){swap[a]=stack[a].style.display;stack[a].style.display="block";}ret=prop=="display"&&swap[stack.length-1]!=null?"none":document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop)||"";for(a=0;a<swap.length;a++)if(swap[a]!=null)stack[a].style.display=swap[a];}if(prop=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var newProp=prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});ret=elem.currentStyle[prop]||elem.currentStyle[newProp];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var style=elem.style.left;var runtimeStyle=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;elem.style.left=ret||0;ret=elem.style.pixelLeft+"px";elem.style.left=style;elem.runtimeStyle.left=runtimeStyle;}}return ret;},clean:function(a,doc){var r=[];doc=doc||document;jQuery.each(a,function(i,arg){if(!arg)return;if(arg.constructor==Number)arg=arg.toString();if(typeof arg=="string"){arg=arg.replace(/(<(\w+)[^>]*?)\/>/g,function(m,all,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)?m:all+"></"+tag+">";});var s=jQuery.trim(arg).toLowerCase(),div=doc.createElement("div"),tb=[];var wrap=!s.indexOf("<opt")&&[1,"<select>","</select>"]||!s.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||s.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!s.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!s.indexOf("<td")||!s.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!s.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+arg+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){if(!s.indexOf("<table")&&s.indexOf("<tbody")<0)tb=div.firstChild&&div.firstChild.childNodes;else if(wrap[1]=="<table>"&&s.indexOf("<tbody")<0)tb=div.childNodes;for(var n=tb.length-1;n>=0;--n)if(jQuery.nodeName(tb[n],"tbody")&&!tb[n].childNodes.length)tb[n].parentNode.removeChild(tb[n]);if(/^\s/.test(arg))div.insertBefore(doc.createTextNode(arg.match(/^\s*/)[0]),div.firstChild);}arg=jQuery.makeArray(div.childNodes);}if(0===arg.length&&(!jQuery.nodeName(arg,"form")&&!jQuery.nodeName(arg,"select")))return;if(arg[0]==undefined||jQuery.nodeName(arg,"form")||arg.options)r.push(arg);else
   38.24 +r=jQuery.merge(r,arg);});return r;},attr:function(elem,name,value){var fix=jQuery.isXMLDoc(elem)?{}:jQuery.props;if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(fix[name]){if(value!=undefined)elem[fix[name]]=value;return elem[fix[name]];}else if(jQuery.browser.msie&&name=="style")return jQuery.attr(elem.style,"cssText",value);else if(value==undefined&&jQuery.browser.msie&&jQuery.nodeName(elem,"form")&&(name=="action"||name=="method"))return elem.getAttributeNode(name).nodeValue;else if(elem.tagName){if(value!=undefined){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem.setAttribute(name,value);}if(jQuery.browser.msie&&/href|src/.test(name)&&!jQuery.isXMLDoc(elem))return elem.getAttribute(name,2);return elem.getAttribute(name);}else{if(name=="opacity"&&jQuery.browser.msie){if(value!=undefined){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseFloat(value).toString()=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100).toString():"";}name=name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});if(value!=undefined)elem[name]=value;return elem[name];}},trim:function(t){return(t||"").replace(/^\s+|\s+$/g,"");},makeArray:function(a){var r=[];if(typeof a!="array")for(var i=0,al=a.length;i<al;i++)r.push(a[i]);else
   38.25 +r=a.slice(0);return r;},inArray:function(b,a){for(var i=0,al=a.length;i<al;i++)if(a[i]==b)return i;return-1;},merge:function(first,second){if(jQuery.browser.msie){for(var i=0;second[i];i++)if(second[i].nodeType!=8)first.push(second[i]);}else
   38.26 +for(var i=0;second[i];i++)first.push(second[i]);return first;},unique:function(first){var r=[],done={};try{for(var i=0,fl=first.length;i<fl;i++){var id=jQuery.data(first[i]);if(!done[id]){done[id]=true;r.push(first[i]);}}}catch(e){r=first;}return r;},grep:function(elems,fn,inv){if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++)if(!inv&&fn(elems[i],i)||inv&&!fn(elems[i],i))result.push(elems[i]);return result;},map:function(elems,fn){if(typeof fn=="string")fn=eval("false||function(a){return "+fn+"}");var result=[];for(var i=0,el=elems.length;i<el;i++){var val=fn(elems[i],i);if(val!==null&&val!=undefined){if(val.constructor!=Array)val=[val];result=result.concat(val);}}return result;}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",styleFloat:jQuery.browser.msie?"styleFloat":"cssFloat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,innerHTML:"innerHTML",className:"className",value:"value",disabled:"disabled",checked:"checked",readonly:"readOnly",selected:"selected",maxlength:"maxLength"}});jQuery.each({parent:"a.parentNode",parents:"jQuery.dir(a,'parentNode')",next:"jQuery.nth(a,2,'nextSibling')",prev:"jQuery.nth(a,2,'previousSibling')",nextAll:"jQuery.dir(a,'nextSibling')",prevAll:"jQuery.dir(a,'previousSibling')",siblings:"jQuery.sibling(a.parentNode.firstChild,a)",children:"jQuery.sibling(a.firstChild)",contents:"jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"},function(i,n){jQuery.fn[i]=function(a){var ret=jQuery.map(this,n);if(a&&typeof a=="string")ret=jQuery.multiFilter(a,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(i,n){jQuery.fn[i]=function(){var a=arguments;return this.each(function(){for(var j=0,al=a.length;j<al;j++)jQuery(a[j])[n](this);});};});jQuery.each({removeAttr:function(key){jQuery.attr(this,key,"");this.removeAttribute(key);},addClass:function(c){jQuery.className.add(this,c);},removeClass:function(c){jQuery.className.remove(this,c);},toggleClass:function(c){jQuery.className[jQuery.className.has(this,c)?"remove":"add"](this,c);},remove:function(a){if(!a||jQuery.filter(a,[this]).r.length){jQuery.removeData(this);this.parentNode.removeChild(this);}},empty:function(){jQuery("*",this).each(function(){jQuery.removeData(this);});while(this.firstChild)this.removeChild(this.firstChild);}},function(i,n){jQuery.fn[i]=function(){return this.each(n,arguments);};});jQuery.each(["Height","Width"],function(i,name){var n=name.toLowerCase();jQuery.fn[n]=function(h){return this[0]==window?jQuery.browser.safari&&self["inner"+name]||jQuery.boxModel&&Math.max(document.documentElement["client"+name],document.body["client"+name])||document.body["client"+name]:this[0]==document?Math.max(document.body["scroll"+name],document.body["offset"+name]):h==undefined?(this.length?jQuery.css(this[0],n):null):this.css(n,h.constructor==String?h:h+"px");};});var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":"m[2]=='*'||jQuery.nodeName(a,m[2])","#":"a.getAttribute('id')==m[2]",":":{lt:"i<m[3]-0",gt:"i>m[3]-0",nth:"m[3]-0==i",eq:"m[3]-0==i",first:"i==0",last:"i==r.length-1",even:"i%2==0",odd:"i%2","first-child":"a.parentNode.getElementsByTagName('*')[0]==a","last-child":"jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a","only-child":"!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",parent:"a.firstChild",empty:"!a.firstChild",contains:"(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",visible:'"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',hidden:'"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',enabled:"!a.disabled",disabled:"a.disabled",checked:"a.checked",selected:"a.selected||jQuery.attr(a,'selected')",text:"'text'==a.type",radio:"'radio'==a.type",checkbox:"'checkbox'==a.type",file:"'file'==a.type",password:"'password'==a.type",submit:"'submit'==a.type",image:"'image'==a.type",reset:"'reset'==a.type",button:'"button"==a.type||jQuery.nodeName(a,"button")',input:"/input|select|textarea|button/i.test(a.nodeName)",has:"jQuery.find(m[3],a).length",header:"/h\\d/i.test(a.nodeName)",animated:"jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&!context.nodeType)context=null;context=context||document;var ret=[context],done=[],last;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false;var re=quickChild;var m=re.exec(t);if(m){var nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName.toUpperCase()))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var nodeName=m[2],merge={};m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName.toUpperCase()){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=jQuery.filter(m[3],r,true).r;else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(\d*)n\+?(\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"n+"+m[3]||m[3]),first=(test[1]||1)-0,last=test[2]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==1){if(last==0||node.nodeIndex==last)add=true;}else if((node.nodeIndex+last)%first==0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var f=jQuery.expr[m[1]];if(typeof f!="string")f=jQuery.expr[m[1]][m[2]];f=eval("false||function(a,i){return "+f+"}");r=jQuery.grep(r,f,not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[];var cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&(!elem||n!=elem))r.push(n);}return r;}});jQuery.event={add:function(element,type,handler,data){if(jQuery.browser.msie&&element.setInterval!=undefined)element=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=function(){return fn.apply(this,arguments);};handler.data=data;handler.guid=fn.guid;}var parts=type.split(".");type=parts[0];handler.type=parts[1];var events=jQuery.data(element,"events")||jQuery.data(element,"events",{});var handle=jQuery.data(element,"handle",function(){var val;if(typeof jQuery=="undefined"||jQuery.event.triggered)return val;val=jQuery.event.handle.apply(element,arguments);return val;});var handlers=events[type];if(!handlers){handlers=events[type]={};if(element.addEventListener)element.addEventListener(type,handle,false);else
   38.27 +element.attachEvent("on"+type,handle);}handlers[handler.guid]=handler;this.global[type]=true;},guid:1,global:{},remove:function(element,type,handler){var events=jQuery.data(element,"events"),ret,index;if(typeof type=="string"){var parts=type.split(".");type=parts[0];}if(events){if(type&&type.type){handler=type.handler;type=type.type;}if(!type){for(type in events)this.remove(element,type);}else if(events[type]){if(handler)delete events[type][handler.guid];else
   38.28 +for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(element.removeEventListener)element.removeEventListener(type,jQuery.data(element,"handle"),false);else
   38.29 +element.detachEvent("on"+type,jQuery.data(element,"handle"));ret=null;delete events[type];}}for(ret in events)break;if(!ret){jQuery.removeData(element,"events");jQuery.removeData(element,"handle");}}},trigger:function(type,data,element,donative,extra){data=jQuery.makeArray(data||[]);if(!element){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{var val,ret,fn=jQuery.isFunction(element[type]||null),evt=!data[0]||!data[0].preventDefault;if(evt)data.unshift(this.fix({type:type,target:element}));data[0].type=type;if(jQuery.isFunction(jQuery.data(element,"handle")))val=jQuery.data(element,"handle").apply(element,data);if(!fn&&element["on"+type]&&element["on"+type].apply(element,data)===false)val=false;if(evt)data.shift();if(extra&&extra.apply(element,data)===false)val=false;if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(element,'a')&&type=="click")){this.triggered=true;element[type]();}this.triggered=false;}return val;},handle:function(event){var val;event=jQuery.event.fix(event||window.event||{});var parts=event.type.split(".");event.type=parts[0];var c=jQuery.data(this,"events")&&jQuery.data(this,"events")[event.type],args=Array.prototype.slice.call(arguments,1);args.unshift(event);for(var j in c){args[0].handler=c[j];args[0].data=c[j].data;if(!parts[1]||c[j].type==parts[1]){var tmp=c[j].apply(this,args);if(val!==false)val=tmp;if(tmp===false){event.preventDefault();event.stopPropagation();}}}if(jQuery.browser.msie)event.target=event.preventDefault=event.stopPropagation=event.handler=event.data=null;return val;},fix:function(event){var originalEvent=event;event=jQuery.extend({},originalEvent);event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};if(!event.target&&event.srcElement)event.target=event.srcElement;if(jQuery.browser.safari&&event.target.nodeType==3)event.target=originalEvent.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var e=document.documentElement,b=document.body;event.pageX=event.clientX+(e&&e.scrollLeft||b.scrollLeft||0);event.pageY=event.clientY+(e&&e.scrollTop||b.scrollTop||0);}if(!event.which&&(event.charCode||event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){return this.each(function(){jQuery.event.add(this,type,function(event){jQuery(this).unbind(event);return(fn||data).apply(this,arguments);},fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){if(this[0])return jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(){var a=arguments;return this.click(function(e){this.lastToggle=0==this.lastToggle?1:0;e.preventDefault();return a[this.lastToggle].apply(this,[e])||false;});},hover:function(f,g){function handleHover(e){var p=e.relatedTarget;while(p&&p!=this)try{p=p.parentNode;}catch(e){p=this;};if(p==this)return false;return(e.type=="mouseover"?f:g).apply(this,[e]);}return this.mouseover(handleHover).mouseout(handleHover);},ready:function(f){bindReady();if(jQuery.isReady)f.apply(document,[jQuery]);else
   38.30 +jQuery.readyList.push(function(){return f.apply(this,[jQuery]);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.apply(document);});jQuery.readyList=null;}if(jQuery.browser.mozilla||jQuery.browser.opera)document.removeEventListener("DOMContentLoaded",jQuery.ready,false);if(!window.frames.length)jQuery(window).load(function(){jQuery("#__ie_init").remove();});}}});jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,o){jQuery.fn[o]=function(f){return f?this.bind(o,f):this.trigger(o);};});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(jQuery.browser.mozilla||jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);else if(jQuery.browser.msie){document.write("<scr"+"ipt id=__ie_init defer=true "+"src=//:><\/script>");var script=document.getElementById("__ie_init");if(script)script.onreadystatechange=function(){if(this.readyState!="complete")return;jQuery.ready();};script=null;}else if(jQuery.browser.safari)jQuery.safariTimer=setInterval(function(){if(document.readyState=="loaded"||document.readyState=="complete"){clearInterval(jQuery.safariTimer);jQuery.safariTimer=null;jQuery.ready();}},10);jQuery.event.add(window,"load",jQuery.ready);}jQuery.fn.extend({load:function(url,params,callback){if(jQuery.isFunction(url))return this.bind("load",url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);setTimeout(function(){self.each(callback,[res.responseText,status,res]);},13);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=(new Date).getTime();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null},lastModified:{},ajax:function(s){var jsonp,jsre=/=(\?|%3F)/g,status,data;s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(s.type.toLowerCase()=="get"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=s.data.replace(jsre,"="+jsonp);s.url=s.url.replace(jsre,"="+jsonp);s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&s.type.toLowerCase()=="get")s.url+=(s.url.match(/\?/)?"&":"?")+"_="+(new Date()).getTime();if(s.data&&s.type.toLowerCase()=="get"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");if(!s.url.indexOf("http")&&s.dataType=="script"){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(!jsonp&&(s.success||s.complete)){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return;}var requestDone=false;var xml=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();xml.open(s.type,s.url,s.async);if(s.data)xml.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xml.setRequestHeader("X-Requested-With","XMLHttpRequest");if(s.beforeSend)s.beforeSend(xml);if(s.global)jQuery.event.trigger("ajaxSend",[xml,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xml&&(xml.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xml)&&"error"||s.ifModified&&jQuery.httpNotModified(xml,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xml,s.dataType);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xml.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
   38.31 +jQuery.handleError(s,xml,status);complete();if(s.async)xml=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xml){xml.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xml.send(s.data);}catch(e){jQuery.handleError(s,xml,null,e);}if(!s.async)onreadystatechange();return xml;function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xml,s]);}function complete(){if(s.complete)s.complete(xml,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xml,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}},handleError:function(s,xml,status,e){if(s.error)s.error(xml,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xml,s,e]);},active:0,httpSuccess:function(r){try{return!r.status&&location.protocol=="file:"||(r.status>=200&&r.status<300)||r.status==304||jQuery.browser.safari&&r.status==undefined;}catch(e){}return false;},httpNotModified:function(xml,url){try{var xmlRes=xml.getResponseHeader("Last-Modified");return xml.status==304||xmlRes==jQuery.lastModified[url]||jQuery.browser.safari&&xml.status==undefined;}catch(e){}return false;},httpData:function(r,type){var ct=r.getResponseHeader("content-type");var xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0;var data=xml?r.responseXML:r.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
   38.32 +for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
   38.33 +s.push(encodeURIComponent(j)+"="+encodeURIComponent(a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock?this.oldblock:"";if(jQuery.css(this,"display")=="none")this.style.display="block";}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");if(this.oldblock=="none")this.oldblock="block";this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle(fn,fn2):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var opt=jQuery.speed(speed,easing,callback);return this[opt.queue===false?"each":"queue"](function(){opt=jQuery.extend({},opt);var hidden=jQuery(this).is(":hidden"),self=this;for(var p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return jQuery.isFunction(opt.complete)&&opt.complete.apply(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
   38.34 +e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.apply(this);}});},stop:function(){var timers=jQuery.timers;return this.each(function(){for(var i=0;i<timers.length;i++)if(timers[i].elem==this)timers.splice(i--,1);}).dequeue();}});var queue=function(elem,type,array){if(!elem)return;var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",array?jQuery.makeArray(array):[]);return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].apply(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:{slow:600,fast:200}[opt.duration])||400;opt.old=opt.complete;opt.complete=function(){jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.apply(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.apply(this.elem,[this.now,this]);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.curCSS(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.css(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=(new Date()).getTime();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(){return self.step();}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timers.length==1){var timer=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length)clearInterval(timer);},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(){var t=(new Date()).getTime();if(t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done&&jQuery.isFunction(this.options.complete))this.options.complete.apply(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.fx.step={scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}};jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var absolute=jQuery.css(elem,"position")=="absolute",parent=elem.parentNode,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522;if(elem.getBoundingClientRect){box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));if(msie){var border=jQuery("html").css("borderWidth");border=(border=="medium"||jQuery.boxModel&&parseInt(version)>=7)&&2||border;add(-border,-border);}}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&/^t[d|h]$/i.test(parent.tagName)||!safari2)border(offsetParent);if(safari2&&!absolute&&jQuery.css(offsetParent,"position")=="absolute")absolute=true;offsetParent=offsetParent.offsetParent;}while(parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table-row.*$/i.test(jQuery.css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&jQuery.css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if(safari2&&absolute)add(-doc.body.offsetLeft,-doc.body.offsetTop);}results={top:top,left:left};}return results;function border(elem){add(jQuery.css(elem,"borderLeftWidth"),jQuery.css(elem,"borderTopWidth"));}function add(l,t){left+=parseInt(l)||0;top+=parseInt(t)||0;}};})();
   38.35 \ No newline at end of file
    39.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    39.2 +++ b/web/support/javascript/jquery.js	Tue Oct 27 21:31:06 2009 -0700
    39.3 @@ -0,0 +1,2992 @@
    39.4 +(function(){
    39.5 +/*
    39.6 + * jQuery 1.2.1 - New Wave Javascript
    39.7 + *
    39.8 + * Copyright (c) 2007 John Resig (jquery.com)
    39.9 + * Dual licensed under the MIT (MIT-LICENSE.txt)
   39.10 + * and GPL (GPL-LICENSE.txt) licenses.
   39.11 + *
   39.12 + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   39.13 + * $Rev: 3353 $
   39.14 + */
   39.15 +
   39.16 +// Map over jQuery in case of overwrite
   39.17 +if ( typeof jQuery != "undefined" )
   39.18 +	var _jQuery = jQuery;
   39.19 +
   39.20 +var jQuery = window.jQuery = function(selector, context) {
   39.21 +	// If the context is a namespace object, return a new object
   39.22 +	return this instanceof jQuery ?
   39.23 +		this.init(selector, context) :
   39.24 +		new jQuery(selector, context);
   39.25 +};
   39.26 +
   39.27 +// Map over the $ in case of overwrite
   39.28 +if ( typeof $ != "undefined" )
   39.29 +	var _$ = $;
   39.30 +	
   39.31 +// Map the jQuery namespace to the '$' one
   39.32 +window.$ = jQuery;
   39.33 +
   39.34 +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
   39.35 +
   39.36 +jQuery.fn = jQuery.prototype = {
   39.37 +	init: function(selector, context) {
   39.38 +		// Make sure that a selection was provided
   39.39 +		selector = selector || document;
   39.40 +
   39.41 +		// Handle HTML strings
   39.42 +		if ( typeof selector  == "string" ) {
   39.43 +			var m = quickExpr.exec(selector);
   39.44 +			if ( m && (m[1] || !context) ) {
   39.45 +				// HANDLE: $(html) -> $(array)
   39.46 +				if ( m[1] )
   39.47 +					selector = jQuery.clean( [ m[1] ], context );
   39.48 +
   39.49 +				// HANDLE: $("#id")
   39.50 +				else {
   39.51 +					var tmp = document.getElementById( m[3] );
   39.52 +					if ( tmp )
   39.53 +						// Handle the case where IE and Opera return items
   39.54 +						// by name instead of ID
   39.55 +						if ( tmp.id != m[3] )
   39.56 +							return jQuery().find( selector );
   39.57 +						else {
   39.58 +							this[0] = tmp;
   39.59 +							this.length = 1;
   39.60 +							return this;
   39.61 +						}
   39.62 +					else
   39.63 +						selector = [];
   39.64 +				}
   39.65 +
   39.66 +			// HANDLE: $(expr)
   39.67 +			} else
   39.68 +				return new jQuery( context ).find( selector );
   39.69 +
   39.70 +		// HANDLE: $(function)
   39.71 +		// Shortcut for document ready
   39.72 +		} else if ( jQuery.isFunction(selector) )
   39.73 +			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
   39.74 +
   39.75 +		return this.setArray(
   39.76 +			// HANDLE: $(array)
   39.77 +			selector.constructor == Array && selector ||
   39.78 +
   39.79 +			// HANDLE: $(arraylike)
   39.80 +			// Watch for when an array-like object is passed as the selector
   39.81 +			(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
   39.82 +
   39.83 +			// HANDLE: $(*)
   39.84 +			[ selector ] );
   39.85 +	},
   39.86 +	
   39.87 +	jquery: "1.2.1",
   39.88 +
   39.89 +	size: function() {
   39.90 +		return this.length;
   39.91 +	},
   39.92 +	
   39.93 +	length: 0,
   39.94 +
   39.95 +	get: function( num ) {
   39.96 +		return num == undefined ?
   39.97 +
   39.98 +			// Return a 'clean' array
   39.99 +			jQuery.makeArray( this ) :
  39.100 +
  39.101 +			// Return just the object
  39.102 +			this[num];
  39.103 +	},
  39.104 +	
  39.105 +	pushStack: function( a ) {
  39.106 +		var ret = jQuery(a);
  39.107 +		ret.prevObject = this;
  39.108 +		return ret;
  39.109 +	},
  39.110 +	
  39.111 +	setArray: function( a ) {
  39.112 +		this.length = 0;
  39.113 +		Array.prototype.push.apply( this, a );
  39.114 +		return this;
  39.115 +	},
  39.116 +
  39.117 +	each: function( fn, args ) {
  39.118 +		return jQuery.each( this, fn, args );
  39.119 +	},
  39.120 +
  39.121 +	index: function( obj ) {
  39.122 +		var pos = -1;
  39.123 +		this.each(function(i){
  39.124 +			if ( this == obj ) pos = i;
  39.125 +		});
  39.126 +		return pos;
  39.127 +	},
  39.128 +
  39.129 +	attr: function( key, value, type ) {
  39.130 +		var obj = key;
  39.131 +		
  39.132 +		// Look for the case where we're accessing a style value
  39.133 +		if ( key.constructor == String )
  39.134 +			if ( value == undefined )
  39.135 +				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
  39.136 +			else {
  39.137 +				obj = {};
  39.138 +				obj[ key ] = value;
  39.139 +			}
  39.140 +		
  39.141 +		// Check to see if we're setting style values
  39.142 +		return this.each(function(index){
  39.143 +			// Set all the styles
  39.144 +			for ( var prop in obj )
  39.145 +				jQuery.attr(
  39.146 +					type ? this.style : this,
  39.147 +					prop, jQuery.prop(this, obj[prop], type, index, prop)
  39.148 +				);
  39.149 +		});
  39.150 +	},
  39.151 +
  39.152 +	css: function( key, value ) {
  39.153 +		return this.attr( key, value, "curCSS" );
  39.154 +	},
  39.155 +
  39.156 +	text: function(e) {
  39.157 +		if ( typeof e != "object" && e != null )
  39.158 +			return this.empty().append( document.createTextNode( e ) );
  39.159 +
  39.160 +		var t = "";
  39.161 +		jQuery.each( e || this, function(){
  39.162 +			jQuery.each( this.childNodes, function(){
  39.163 +				if ( this.nodeType != 8 )
  39.164 +					t += this.nodeType != 1 ?
  39.165 +						this.nodeValue : jQuery.fn.text([ this ]);
  39.166 +			});
  39.167 +		});
  39.168 +		return t;
  39.169 +	},
  39.170 +
  39.171 +	wrapAll: function(html) {
  39.172 +		if ( this[0] )
  39.173 +			// The elements to wrap the target around
  39.174 +			jQuery(html, this[0].ownerDocument)
  39.175 +				.clone()
  39.176 +				.insertBefore(this[0])
  39.177 +				.map(function(){
  39.178 +					var elem = this;
  39.179 +					while ( elem.firstChild )
  39.180 +						elem = elem.firstChild;
  39.181 +					return elem;
  39.182 +				})
  39.183 +				.append(this);
  39.184 +
  39.185 +		return this;
  39.186 +	},
  39.187 +
  39.188 +	wrapInner: function(html) {
  39.189 +		return this.each(function(){
  39.190 +			jQuery(this).contents().wrapAll(html);
  39.191 +		});
  39.192 +	},
  39.193 +
  39.194 +	wrap: function(html) {
  39.195 +		return this.each(function(){
  39.196 +			jQuery(this).wrapAll(html);
  39.197 +		});
  39.198 +	},
  39.199 +
  39.200 +	append: function() {
  39.201 +		return this.domManip(arguments, true, 1, function(a){
  39.202 +			this.appendChild( a );
  39.203 +		});
  39.204 +	},
  39.205 +
  39.206 +	prepend: function() {
  39.207 +		return this.domManip(arguments, true, -1, function(a){
  39.208 +			this.insertBefore( a, this.firstChild );
  39.209 +		});
  39.210 +	},
  39.211 +	
  39.212 +	before: function() {
  39.213 +		return this.domManip(arguments, false, 1, function(a){
  39.214 +			this.parentNode.insertBefore( a, this );
  39.215 +		});
  39.216 +	},
  39.217 +
  39.218 +	after: function() {
  39.219 +		return this.domManip(arguments, false, -1, function(a){
  39.220 +			this.parentNode.insertBefore( a, this.nextSibling );
  39.221 +		});
  39.222 +	},
  39.223 +
  39.224 +	end: function() {
  39.225 +		return this.prevObject || jQuery([]);
  39.226 +	},
  39.227 +
  39.228 +	find: function(t) {
  39.229 +		var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
  39.230 +		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
  39.231 +			jQuery.unique( data ) : data );
  39.232 +	},
  39.233 +
  39.234 +	clone: function(events) {
  39.235 +		// Do the clone
  39.236 +		var ret = this.map(function(){
  39.237 +			return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
  39.238 +		});
  39.239 +
  39.240 +		// Need to set the expando to null on the cloned set if it exists
  39.241 +		// removeData doesn't work here, IE removes it from the original as well
  39.242 +		// this is primarily for IE but the data expando shouldn't be copied over in any browser
  39.243 +		var clone = ret.find("*").andSelf().each(function(){
  39.244 +			if ( this[ expando ] != undefined )
  39.245 +				this[ expando ] = null;
  39.246 +		});
  39.247 +		
  39.248 +		// Copy the events from the original to the clone
  39.249 +		if (events === true)
  39.250 +			this.find("*").andSelf().each(function(i) {
  39.251 +				var events = jQuery.data(this, "events");
  39.252 +				for ( var type in events )
  39.253 +					for ( var handler in events[type] )
  39.254 +						jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
  39.255 +			});
  39.256 +
  39.257 +		// Return the cloned set
  39.258 +		return ret;
  39.259 +	},
  39.260 +
  39.261 +	filter: function(t) {
  39.262 +		return this.pushStack(
  39.263 +			jQuery.isFunction( t ) &&
  39.264 +			jQuery.grep(this, function(el, index){
  39.265 +				return t.apply(el, [index]);
  39.266 +			}) ||
  39.267 +
  39.268 +			jQuery.multiFilter(t,this) );
  39.269 +	},
  39.270 +
  39.271 +	not: function(t) {
  39.272 +		return this.pushStack(
  39.273 +			t.constructor == String &&
  39.274 +			jQuery.multiFilter(t, this, true) ||
  39.275 +
  39.276 +			jQuery.grep(this, function(a) {
  39.277 +				return ( t.constructor == Array || t.jquery )
  39.278 +					? jQuery.inArray( a, t ) < 0
  39.279 +					: a != t;
  39.280 +			})
  39.281 +		);
  39.282 +	},
  39.283 +
  39.284 +	add: function(t) {
  39.285 +		return this.pushStack( jQuery.merge(
  39.286 +			this.get(),
  39.287 +			t.constructor == String ?
  39.288 +				jQuery(t).get() :
  39.289 +				t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
  39.290 +					t : [t] )
  39.291 +		);
  39.292 +	},
  39.293 +
  39.294 +	is: function(expr) {
  39.295 +		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
  39.296 +	},
  39.297 +
  39.298 +	hasClass: function(expr) {
  39.299 +		return this.is("." + expr);
  39.300 +	},
  39.301 +	
  39.302 +	val: function( val ) {
  39.303 +		if ( val == undefined ) {
  39.304 +			if ( this.length ) {
  39.305 +				var elem = this[0];
  39.306 +		    	
  39.307 +				// We need to handle select boxes special
  39.308 +				if ( jQuery.nodeName(elem, "select") ) {
  39.309 +					var index = elem.selectedIndex,
  39.310 +						a = [],
  39.311 +						options = elem.options,
  39.312 +						one = elem.type == "select-one";
  39.313 +					
  39.314 +					// Nothing was selected
  39.315 +					if ( index < 0 )
  39.316 +						return null;
  39.317 +
  39.318 +					// Loop through all the selected options
  39.319 +					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  39.320 +						var option = options[i];
  39.321 +						if ( option.selected ) {
  39.322 +							// Get the specifc value for the option
  39.323 +							var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
  39.324 +							
  39.325 +							// We don't need an array for one selects
  39.326 +							if ( one )
  39.327 +								return val;
  39.328 +							
  39.329 +							// Multi-Selects return an array
  39.330 +							a.push(val);
  39.331 +						}
  39.332 +					}
  39.333 +					
  39.334 +					return a;
  39.335 +					
  39.336 +				// Everything else, we just grab the value
  39.337 +				} else
  39.338 +					return this[0].value.replace(/\r/g, "");
  39.339 +			}
  39.340 +		} else
  39.341 +			return this.each(function(){
  39.342 +				if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
  39.343 +					this.checked = (jQuery.inArray(this.value, val) >= 0 ||
  39.344 +						jQuery.inArray(this.name, val) >= 0);
  39.345 +				else if ( jQuery.nodeName(this, "select") ) {
  39.346 +					var tmp = val.constructor == Array ? val : [val];
  39.347 +
  39.348 +					jQuery("option", this).each(function(){
  39.349 +						this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
  39.350 +						jQuery.inArray(this.text, tmp) >= 0);
  39.351 +					});
  39.352 +
  39.353 +					if ( !tmp.length )
  39.354 +						this.selectedIndex = -1;
  39.355 +				} else
  39.356 +					this.value = val;
  39.357 +			});
  39.358 +	},
  39.359 +	
  39.360 +	html: function( val ) {
  39.361 +		return val == undefined ?
  39.362 +			( this.length ? this[0].innerHTML : null ) :
  39.363 +			this.empty().append( val );
  39.364 +	},
  39.365 +
  39.366 +	replaceWith: function( val ) {
  39.367 +		return this.after( val ).remove();
  39.368 +	},
  39.369 +
  39.370 +	eq: function(i){
  39.371 +		return this.slice(i, i+1);
  39.372 +	},
  39.373 +
  39.374 +	slice: function() {
  39.375 +		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
  39.376 +	},
  39.377 +
  39.378 +	map: function(fn) {
  39.379 +		return this.pushStack(jQuery.map( this, function(elem,i){
  39.380 +			return fn.call( elem, i, elem );
  39.381 +		}));
  39.382 +	},
  39.383 +
  39.384 +	andSelf: function() {
  39.385 +		return this.add( this.prevObject );
  39.386 +	},
  39.387 +	
  39.388 +	domManip: function(args, table, dir, fn) {
  39.389 +		var clone = this.length > 1, a; 
  39.390 +
  39.391 +		return this.each(function(){
  39.392 +			if ( !a ) {
  39.393 +				a = jQuery.clean(args, this.ownerDocument);
  39.394 +				if ( dir < 0 )
  39.395 +					a.reverse();
  39.396 +			}
  39.397 +
  39.398 +			var obj = this;
  39.399 +
  39.400 +			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
  39.401 +				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
  39.402 +
  39.403 +			jQuery.each( a, function(){
  39.404 +				var elem = clone ? this.cloneNode(true) : this;
  39.405 +				if ( !evalScript(0, elem) )
  39.406 +					fn.call( obj, elem );
  39.407 +			});
  39.408 +		});
  39.409 +	}
  39.410 +};
  39.411 +
  39.412 +function evalScript(i, elem){
  39.413 +	var script = jQuery.nodeName(elem, "script");
  39.414 +
  39.415 +	if ( script ) {
  39.416 +		if ( elem.src )
  39.417 +			jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
  39.418 +		else
  39.419 +			jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  39.420 +	
  39.421 +		if ( elem.parentNode )
  39.422 +			elem.parentNode.removeChild(elem);
  39.423 +
  39.424 +	} else if ( elem.nodeType == 1 )
  39.425 +    jQuery("script", elem).each(evalScript);
  39.426 +
  39.427 +	return script;
  39.428 +}
  39.429 +
  39.430 +jQuery.extend = jQuery.fn.extend = function() {
  39.431 +	// copy reference to target object
  39.432 +	var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
  39.433 +
  39.434 +	// Handle a deep copy situation
  39.435 +	if ( target.constructor == Boolean ) {
  39.436 +		deep = target;
  39.437 +		target = arguments[1] || {};
  39.438 +	}
  39.439 +
  39.440 +	// extend jQuery itself if only one argument is passed
  39.441 +	if ( al == 1 ) {
  39.442 +		target = this;
  39.443 +		a = 0;
  39.444 +	}
  39.445 +
  39.446 +	var prop;
  39.447 +
  39.448 +	for ( ; a < al; a++ )
  39.449 +		// Only deal with non-null/undefined values
  39.450 +		if ( (prop = arguments[a]) != null )
  39.451 +			// Extend the base object
  39.452 +			for ( var i in prop ) {
  39.453 +				// Prevent never-ending loop
  39.454 +				if ( target == prop[i] )
  39.455 +					continue;
  39.456 +
  39.457 +				// Recurse if we're merging object values
  39.458 +				if ( deep && typeof prop[i] == 'object' && target[i] )
  39.459 +					jQuery.extend( target[i], prop[i] );
  39.460 +
  39.461 +				// Don't bring in undefined values
  39.462 +				else if ( prop[i] != undefined )
  39.463 +					target[i] = prop[i];
  39.464 +			}
  39.465 +
  39.466 +	// Return the modified object
  39.467 +	return target;
  39.468 +};
  39.469 +
  39.470 +var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
  39.471 +
  39.472 +jQuery.extend({
  39.473 +	noConflict: function(deep) {
  39.474 +		window.$ = _$;
  39.475 +		if ( deep )
  39.476 +			window.jQuery = _jQuery;
  39.477 +		return jQuery;
  39.478 +	},
  39.479 +
  39.480 +	// This may seem like some crazy code, but trust me when I say that this
  39.481 +	// is the only cross-browser way to do this. --John
  39.482 +	isFunction: function( fn ) {
  39.483 +		return !!fn && typeof fn != "string" && !fn.nodeName && 
  39.484 +			fn.constructor != Array && /function/i.test( fn + "" );
  39.485 +	},
  39.486 +	
  39.487 +	// check if an element is in a XML document
  39.488 +	isXMLDoc: function(elem) {
  39.489 +		return elem.documentElement && !elem.body ||
  39.490 +			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
  39.491 +	},
  39.492 +
  39.493 +	// Evalulates a script in a global context
  39.494 +	// Evaluates Async. in Safari 2 :-(
  39.495 +	globalEval: function( data ) {
  39.496 +		data = jQuery.trim( data );
  39.497 +		if ( data ) {
  39.498 +			if ( window.execScript )
  39.499 +				window.execScript( data );
  39.500 +			else if ( jQuery.browser.safari )
  39.501 +				// safari doesn't provide a synchronous global eval
  39.502 +				window.setTimeout( data, 0 );
  39.503 +			else
  39.504 +				eval.call( window, data );
  39.505 +		}
  39.506 +	},
  39.507 +
  39.508 +	nodeName: function( elem, name ) {
  39.509 +		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  39.510 +	},
  39.511 +	
  39.512 +	cache: {},
  39.513 +	
  39.514 +	data: function( elem, name, data ) {
  39.515 +		elem = elem == window ? win : elem;
  39.516 +
  39.517 +		var id = elem[ expando ];
  39.518 +
  39.519 +		// Compute a unique ID for the element
  39.520 +		if ( !id ) 
  39.521 +			id = elem[ expando ] = ++uuid;
  39.522 +
  39.523 +		// Only generate the data cache if we're
  39.524 +		// trying to access or manipulate it
  39.525 +		if ( name && !jQuery.cache[ id ] )
  39.526 +			jQuery.cache[ id ] = {};
  39.527 +		
  39.528 +		// Prevent overriding the named cache with undefined values
  39.529 +		if ( data != undefined )
  39.530 +			jQuery.cache[ id ][ name ] = data;
  39.531 +		
  39.532 +		// Return the named cache data, or the ID for the element	
  39.533 +		return name ? jQuery.cache[ id ][ name ] : id;
  39.534 +	},
  39.535 +	
  39.536 +	removeData: function( elem, name ) {
  39.537 +		elem = elem == window ? win : elem;
  39.538 +
  39.539 +		var id = elem[ expando ];
  39.540 +
  39.541 +		// If we want to remove a specific section of the element's data
  39.542 +		if ( name ) {
  39.543 +			if ( jQuery.cache[ id ] ) {
  39.544 +				// Remove the section of cache data
  39.545 +				delete jQuery.cache[ id ][ name ];
  39.546 +
  39.547 +				// If we've removed all the data, remove the element's cache
  39.548 +				name = "";
  39.549 +				for ( name in jQuery.cache[ id ] ) break;
  39.550 +				if ( !name )
  39.551 +					jQuery.removeData( elem );
  39.552 +			}
  39.553 +
  39.554 +		// Otherwise, we want to remove all of the element's data
  39.555 +		} else {
  39.556 +			// Clean up the element expando
  39.557 +			try {
  39.558 +				delete elem[ expando ];
  39.559 +			} catch(e){
  39.560 +				// IE has trouble directly removing the expando
  39.561 +				// but it's ok with using removeAttribute
  39.562 +				if ( elem.removeAttribute )
  39.563 +					elem.removeAttribute( expando );
  39.564 +			}
  39.565 +
  39.566 +			// Completely remove the data cache
  39.567 +			delete jQuery.cache[ id ];
  39.568 +		}
  39.569 +	},
  39.570 +
  39.571 +	// args is for internal usage only
  39.572 +	each: function( obj, fn, args ) {
  39.573 +		if ( args ) {
  39.574 +			if ( obj.length == undefined )
  39.575 +				for ( var i in obj )
  39.576 +					fn.apply( obj[i], args );
  39.577 +			else
  39.578 +				for ( var i = 0, ol = obj.length; i < ol; i++ )
  39.579 +					if ( fn.apply( obj[i], args ) === false ) break;
  39.580 +
  39.581 +		// A special, fast, case for the most common use of each
  39.582 +		} else {
  39.583 +			if ( obj.length == undefined )
  39.584 +				for ( var i in obj )
  39.585 +					fn.call( obj[i], i, obj[i] );
  39.586 +			else
  39.587 +				for ( var i = 0, ol = obj.length, val = obj[0]; 
  39.588 +					i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
  39.589 +		}
  39.590 +
  39.591 +		return obj;
  39.592 +	},
  39.593 +	
  39.594 +	prop: function(elem, value, type, index, prop){
  39.595 +			// Handle executable functions
  39.596 +			if ( jQuery.isFunction( value ) )
  39.597 +				value = value.call( elem, [index] );
  39.598 +				
  39.599 +			// exclude the following css properties to add px
  39.600 +			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
  39.601 +
  39.602 +			// Handle passing in a number to a CSS property
  39.603 +			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
  39.604 +				value + "px" :
  39.605 +				value;
  39.606 +	},
  39.607 +
  39.608 +	className: {
  39.609 +		// internal only, use addClass("class")
  39.610 +		add: function( elem, c ){
  39.611 +			jQuery.each( (c || "").split(/\s+/), function(i, cur){
  39.612 +				if ( !jQuery.className.has( elem.className, cur ) )
  39.613 +					elem.className += ( elem.className ? " " : "" ) + cur;
  39.614 +			});
  39.615 +		},
  39.616 +
  39.617 +		// internal only, use removeClass("class")
  39.618 +		remove: function( elem, c ){
  39.619 +			elem.className = c != undefined ?
  39.620 +				jQuery.grep( elem.className.split(/\s+/), function(cur){
  39.621 +					return !jQuery.className.has( c, cur );	
  39.622 +				}).join(" ") : "";
  39.623 +		},
  39.624 +
  39.625 +		// internal only, use is(".class")
  39.626 +		has: function( t, c ) {
  39.627 +			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
  39.628 +		}
  39.629 +	},
  39.630 +
  39.631 +	swap: function(e,o,f) {
  39.632 +		for ( var i in o ) {
  39.633 +			e.style["old"+i] = e.style[i];
  39.634 +			e.style[i] = o[i];
  39.635 +		}
  39.636 +		f.apply( e, [] );
  39.637 +		for ( var i in o )
  39.638 +			e.style[i] = e.style["old"+i];
  39.639 +	},
  39.640 +
  39.641 +	css: function(e,p) {
  39.642 +		if ( p == "height" || p == "width" ) {
  39.643 +			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
  39.644 +
  39.645 +			jQuery.each( d, function(){
  39.646 +				old["padding" + this] = 0;
  39.647 +				old["border" + this + "Width"] = 0;
  39.648 +			});
  39.649 +
  39.650 +			jQuery.swap( e, old, function() {
  39.651 +				if ( jQuery(e).is(':visible') ) {
  39.652 +					oHeight = e.offsetHeight;
  39.653 +					oWidth = e.offsetWidth;
  39.654 +				} else {
  39.655 +					e = jQuery(e.cloneNode(true))
  39.656 +						.find(":radio").removeAttr("checked").end()
  39.657 +						.css({
  39.658 +							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
  39.659 +						}).appendTo(e.parentNode)[0];
  39.660 +
  39.661 +					var parPos = jQuery.css(e.parentNode,"position") || "static";
  39.662 +					if ( parPos == "static" )
  39.663 +						e.parentNode.style.position = "relative";
  39.664 +
  39.665 +					oHeight = e.clientHeight;
  39.666 +					oWidth = e.clientWidth;
  39.667 +
  39.668 +					if ( parPos == "static" )
  39.669 +						e.parentNode.style.position = "static";
  39.670 +
  39.671 +					e.parentNode.removeChild(e);
  39.672 +				}
  39.673 +			});
  39.674 +
  39.675 +			return p == "height" ? oHeight : oWidth;
  39.676 +		}
  39.677 +
  39.678 +		return jQuery.curCSS( e, p );
  39.679 +	},
  39.680 +
  39.681 +	curCSS: function(elem, prop, force) {
  39.682 +		var ret, stack = [], swap = [];
  39.683 +
  39.684 +		// A helper method for determining if an element's values are broken
  39.685 +		function color(a){
  39.686 +			if ( !jQuery.browser.safari )
  39.687 +				return false;
  39.688 +
  39.689 +			var ret = document.defaultView.getComputedStyle(a,null);
  39.690 +			return !ret || ret.getPropertyValue("color") == "";
  39.691 +		}
  39.692 +
  39.693 +		if (prop == "opacity" && jQuery.browser.msie) {
  39.694 +			ret = jQuery.attr(elem.style, "opacity");
  39.695 +			return ret == "" ? "1" : ret;
  39.696 +		}
  39.697 +		
  39.698 +		if (prop.match(/float/i))
  39.699 +			prop = styleFloat;
  39.700 +
  39.701 +		if (!force && elem.style[prop])
  39.702 +			ret = elem.style[prop];
  39.703 +
  39.704 +		else if (document.defaultView && document.defaultView.getComputedStyle) {
  39.705 +
  39.706 +			if (prop.match(/float/i))
  39.707 +				prop = "float";
  39.708 +
  39.709 +			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
  39.710 +			var cur = document.defaultView.getComputedStyle(elem, null);
  39.711 +
  39.712 +			if ( cur && !color(elem) )
  39.713 +				ret = cur.getPropertyValue(prop);
  39.714 +
  39.715 +			// If the element isn't reporting its values properly in Safari
  39.716 +			// then some display: none elements are involved
  39.717 +			else {
  39.718 +				// Locate all of the parent display: none elements
  39.719 +				for ( var a = elem; a && color(a); a = a.parentNode )
  39.720 +					stack.unshift(a);
  39.721 +
  39.722 +				// Go through and make them visible, but in reverse
  39.723 +				// (It would be better if we knew the exact display type that they had)
  39.724 +				for ( a = 0; a < stack.length; a++ )
  39.725 +					if ( color(stack[a]) ) {
  39.726 +						swap[a] = stack[a].style.display;
  39.727 +						stack[a].style.display = "block";
  39.728 +					}
  39.729 +
  39.730 +				// Since we flip the display style, we have to handle that
  39.731 +				// one special, otherwise get the value
  39.732 +				ret = prop == "display" && swap[stack.length-1] != null ?
  39.733 +					"none" :
  39.734 +					document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
  39.735 +
  39.736 +				// Finally, revert the display styles back
  39.737 +				for ( a = 0; a < swap.length; a++ )
  39.738 +					if ( swap[a] != null )
  39.739 +						stack[a].style.display = swap[a];
  39.740 +			}
  39.741 +
  39.742 +			if ( prop == "opacity" && ret == "" )
  39.743 +				ret = "1";
  39.744 +
  39.745 +		} else if (elem.currentStyle) {
  39.746 +			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
  39.747 +			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
  39.748 +
  39.749 +			// From the awesome hack by Dean Edwards
  39.750 +			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  39.751 +
  39.752 +			// If we're not dealing with a regular pixel number
  39.753 +			// but a number that has a weird ending, we need to convert it to pixels
  39.754 +			if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
  39.755 +				var style = elem.style.left;
  39.756 +				var runtimeStyle = elem.runtimeStyle.left;
  39.757 +				elem.runtimeStyle.left = elem.currentStyle.left;
  39.758 +				elem.style.left = ret || 0;
  39.759 +				ret = elem.style.pixelLeft + "px";
  39.760 +				elem.style.left = style;
  39.761 +				elem.runtimeStyle.left = runtimeStyle;
  39.762 +			}
  39.763 +		}
  39.764 +
  39.765 +		return ret;
  39.766 +	},
  39.767 +	
  39.768 +	clean: function(a, doc) {
  39.769 +		var r = [];
  39.770 +		doc = doc || document;
  39.771 +
  39.772 +		jQuery.each( a, function(i,arg){
  39.773 +			if ( !arg ) return;
  39.774 +
  39.775 +			if ( arg.constructor == Number )
  39.776 +				arg = arg.toString();
  39.777 +			
  39.778 +			// Convert html string into DOM nodes
  39.779 +			if ( typeof arg == "string" ) {
  39.780 +				// Fix "XHTML"-style tags in all browsers
  39.781 +				arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
  39.782 +					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
  39.783 +				});
  39.784 +
  39.785 +				// Trim whitespace, otherwise indexOf won't work as expected
  39.786 +				var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
  39.787 +
  39.788 +				var wrap =
  39.789 +					// option or optgroup
  39.790 +					!s.indexOf("<opt") &&
  39.791 +					[1, "<select>", "</select>"] ||
  39.792 +					
  39.793 +					!s.indexOf("<leg") &&
  39.794 +					[1, "<fieldset>", "</fieldset>"] ||
  39.795 +					
  39.796 +					s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  39.797 +					[1, "<table>", "</table>"] ||
  39.798 +					
  39.799 +					!s.indexOf("<tr") &&
  39.800 +					[2, "<table><tbody>", "</tbody></table>"] ||
  39.801 +					
  39.802 +				 	// <thead> matched above
  39.803 +					(!s.indexOf("<td") || !s.indexOf("<th")) &&
  39.804 +					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
  39.805 +					
  39.806 +					!s.indexOf("<col") &&
  39.807 +					[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
  39.808 +
  39.809 +					// IE can't serialize <link> and <script> tags normally
  39.810 +					jQuery.browser.msie &&
  39.811 +					[1, "div<div>", "</div>"] ||
  39.812 +					
  39.813 +					[0,"",""];
  39.814 +
  39.815 +				// Go to html and back, then peel off extra wrappers
  39.816 +				div.innerHTML = wrap[1] + arg + wrap[2];
  39.817 +				
  39.818 +				// Move to the right depth
  39.819 +				while ( wrap[0]-- )
  39.820 +					div = div.lastChild;
  39.821 +				
  39.822 +				// Remove IE's autoinserted <tbody> from table fragments
  39.823 +				if ( jQuery.browser.msie ) {
  39.824 +					
  39.825 +					// String was a <table>, *may* have spurious <tbody>
  39.826 +					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
  39.827 +						tb = div.firstChild && div.firstChild.childNodes;
  39.828 +						
  39.829 +					// String was a bare <thead> or <tfoot>
  39.830 +					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
  39.831 +						tb = div.childNodes;
  39.832 +
  39.833 +					for ( var n = tb.length-1; n >= 0 ; --n )
  39.834 +						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
  39.835 +							tb[n].parentNode.removeChild(tb[n]);
  39.836 +	
  39.837 +					// IE completely kills leading whitespace when innerHTML is used	
  39.838 +					if ( /^\s/.test(arg) )	
  39.839 +						div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
  39.840 +
  39.841 +				}
  39.842 +				
  39.843 +				arg = jQuery.makeArray( div.childNodes );
  39.844 +			}
  39.845 +
  39.846 +			if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
  39.847 +				return;
  39.848 +
  39.849 +			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
  39.850 +				r.push( arg );
  39.851 +			else
  39.852 +				r = jQuery.merge( r, arg );
  39.853 +
  39.854 +		});
  39.855 +
  39.856 +		return r;
  39.857 +	},
  39.858 +	
  39.859 +	attr: function(elem, name, value){
  39.860 +		var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
  39.861 +
  39.862 +		// Safari mis-reports the default selected property of a hidden option
  39.863 +		// Accessing the parent's selectedIndex property fixes it
  39.864 +		if ( name == "selected" && jQuery.browser.safari )
  39.865 +			elem.parentNode.selectedIndex;
  39.866 +		
  39.867 +		// Certain attributes only work when accessed via the old DOM 0 way
  39.868 +		if ( fix[name] ) {
  39.869 +			if ( value != undefined ) elem[fix[name]] = value;
  39.870 +			return elem[fix[name]];
  39.871 +		} else if ( jQuery.browser.msie && name == "style" )
  39.872 +			return jQuery.attr( elem.style, "cssText", value );
  39.873 +
  39.874 +		else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
  39.875 +			return elem.getAttributeNode(name).nodeValue;
  39.876 +
  39.877 +		// IE elem.getAttribute passes even for style
  39.878 +		else if ( elem.tagName ) {
  39.879 +
  39.880 +			if ( value != undefined ) {
  39.881 +				if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
  39.882 +					throw "type property can't be changed";
  39.883 +				elem.setAttribute( name, value );
  39.884 +			}
  39.885 +
  39.886 +			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
  39.887 +				return elem.getAttribute( name, 2 );
  39.888 +
  39.889 +			return elem.getAttribute( name );
  39.890 +
  39.891 +		// elem is actually elem.style ... set the style
  39.892 +		} else {
  39.893 +			// IE actually uses filters for opacity
  39.894 +			if ( name == "opacity" && jQuery.browser.msie ) {
  39.895 +				if ( value != undefined ) {
  39.896 +					// IE has trouble with opacity if it does not have layout
  39.897 +					// Force it by setting the zoom level
  39.898 +					elem.zoom = 1; 
  39.899 +	
  39.900 +					// Set the alpha filter to set the opacity
  39.901 +					elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
  39.902 +						(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  39.903 +				}
  39.904 +	
  39.905 +				return elem.filter ? 
  39.906 +					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
  39.907 +			}
  39.908 +			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
  39.909 +			if ( value != undefined ) elem[name] = value;
  39.910 +			return elem[name];
  39.911 +		}
  39.912 +	},
  39.913 +	
  39.914 +	trim: function(t){
  39.915 +		return (t||"").replace(/^\s+|\s+$/g, "");
  39.916 +	},
  39.917 +
  39.918 +	makeArray: function( a ) {
  39.919 +		var r = [];
  39.920 +
  39.921 +		// Need to use typeof to fight Safari childNodes crashes
  39.922 +		if ( typeof a != "array" )
  39.923 +			for ( var i = 0, al = a.length; i < al; i++ )
  39.924 +				r.push( a[i] );
  39.925 +		else
  39.926 +			r = a.slice( 0 );
  39.927 +
  39.928 +		return r;
  39.929 +	},
  39.930 +
  39.931 +	inArray: function( b, a ) {
  39.932 +		for ( var i = 0, al = a.length; i < al; i++ )
  39.933 +			if ( a[i] == b )
  39.934 +				return i;
  39.935 +		return -1;
  39.936 +	},
  39.937 +
  39.938 +	merge: function(first, second) {
  39.939 +		// We have to loop this way because IE & Opera overwrite the length
  39.940 +		// expando of getElementsByTagName
  39.941 +
  39.942 +		// Also, we need to make sure that the correct elements are being returned
  39.943 +		// (IE returns comment nodes in a '*' query)
  39.944 +		if ( jQuery.browser.msie ) {
  39.945 +			for ( var i = 0; second[i]; i++ )
  39.946 +				if ( second[i].nodeType != 8 )
  39.947 +					first.push(second[i]);
  39.948 +		} else
  39.949 +			for ( var i = 0; second[i]; i++ )
  39.950 +				first.push(second[i]);
  39.951 +
  39.952 +		return first;
  39.953 +	},
  39.954 +
  39.955 +	unique: function(first) {
  39.956 +		var r = [], done = {};
  39.957 +
  39.958 +		try {
  39.959 +			for ( var i = 0, fl = first.length; i < fl; i++ ) {
  39.960 +				var id = jQuery.data(first[i]);
  39.961 +				if ( !done[id] ) {
  39.962 +					done[id] = true;
  39.963 +					r.push(first[i]);
  39.964 +				}
  39.965 +			}
  39.966 +		} catch(e) {
  39.967 +			r = first;
  39.968 +		}
  39.969 +
  39.970 +		return r;
  39.971 +	},
  39.972 +
  39.973 +	grep: function(elems, fn, inv) {
  39.974 +		// If a string is passed in for the function, make a function
  39.975 +		// for it (a handy shortcut)
  39.976 +		if ( typeof fn == "string" )
  39.977 +			fn = eval("false||function(a,i){return " + fn + "}");
  39.978 +
  39.979 +		var result = [];
  39.980 +
  39.981 +		// Go through the array, only saving the items
  39.982 +		// that pass the validator function
  39.983 +		for ( var i = 0, el = elems.length; i < el; i++ )
  39.984 +			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
  39.985 +				result.push( elems[i] );
  39.986 +
  39.987 +		return result;
  39.988 +	},
  39.989 +
  39.990 +	map: function(elems, fn) {
  39.991 +		// If a string is passed in for the function, make a function
  39.992 +		// for it (a handy shortcut)
  39.993 +		if ( typeof fn == "string" )
  39.994 +			fn = eval("false||function(a){return " + fn + "}");
  39.995 +
  39.996 +		var result = [];
  39.997 +
  39.998 +		// Go through the array, translating each of the items to their
  39.999 +		// new value (or values).
 39.1000 +		for ( var i = 0, el = elems.length; i < el; i++ ) {
 39.1001 +			var val = fn(elems[i],i);
 39.1002 +
 39.1003 +			if ( val !== null && val != undefined ) {
 39.1004 +				if ( val.constructor != Array ) val = [val];
 39.1005 +				result = result.concat( val );
 39.1006 +			}
 39.1007 +		}
 39.1008 +
 39.1009 +		return result;
 39.1010 +	}
 39.1011 +});
 39.1012 +
 39.1013 +var userAgent = navigator.userAgent.toLowerCase();
 39.1014 +
 39.1015 +// Figure out what browser is being used
 39.1016 +jQuery.browser = {
 39.1017 +	version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
 39.1018 +	safari: /webkit/.test(userAgent),
 39.1019 +	opera: /opera/.test(userAgent),
 39.1020 +	msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
 39.1021 +	mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
 39.1022 +};
 39.1023 +
 39.1024 +var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 39.1025 +	
 39.1026 +jQuery.extend({
 39.1027 +	// Check to see if the W3C box model is being used
 39.1028 +	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 39.1029 +	
 39.1030 +	styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
 39.1031 +	
 39.1032 +	props: {
 39.1033 +		"for": "htmlFor",
 39.1034 +		"class": "className",
 39.1035 +		"float": styleFloat,
 39.1036 +		cssFloat: styleFloat,
 39.1037 +		styleFloat: styleFloat,
 39.1038 +		innerHTML: "innerHTML",
 39.1039 +		className: "className",
 39.1040 +		value: "value",
 39.1041 +		disabled: "disabled",
 39.1042 +		checked: "checked",
 39.1043 +		readonly: "readOnly",
 39.1044 +		selected: "selected",
 39.1045 +		maxlength: "maxLength"
 39.1046 +	}
 39.1047 +});
 39.1048 +
 39.1049 +jQuery.each({
 39.1050 +	parent: "a.parentNode",
 39.1051 +	parents: "jQuery.dir(a,'parentNode')",
 39.1052 +	next: "jQuery.nth(a,2,'nextSibling')",
 39.1053 +	prev: "jQuery.nth(a,2,'previousSibling')",
 39.1054 +	nextAll: "jQuery.dir(a,'nextSibling')",
 39.1055 +	prevAll: "jQuery.dir(a,'previousSibling')",
 39.1056 +	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
 39.1057 +	children: "jQuery.sibling(a.firstChild)",
 39.1058 +	contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
 39.1059 +}, function(i,n){
 39.1060 +	jQuery.fn[ i ] = function(a) {
 39.1061 +		var ret = jQuery.map(this,n);
 39.1062 +		if ( a && typeof a == "string" )
 39.1063 +			ret = jQuery.multiFilter(a,ret);
 39.1064 +		return this.pushStack( jQuery.unique(ret) );
 39.1065 +	};
 39.1066 +});
 39.1067 +
 39.1068 +jQuery.each({
 39.1069 +	appendTo: "append",
 39.1070 +	prependTo: "prepend",
 39.1071 +	insertBefore: "before",
 39.1072 +	insertAfter: "after",
 39.1073 +	replaceAll: "replaceWith"
 39.1074 +}, function(i,n){
 39.1075 +	jQuery.fn[ i ] = function(){
 39.1076 +		var a = arguments;
 39.1077 +		return this.each(function(){
 39.1078 +			for ( var j = 0, al = a.length; j < al; j++ )
 39.1079 +				jQuery(a[j])[n]( this );
 39.1080 +		});
 39.1081 +	};
 39.1082 +});
 39.1083 +
 39.1084 +jQuery.each( {
 39.1085 +	removeAttr: function( key ) {
 39.1086 +		jQuery.attr( this, key, "" );
 39.1087 +		this.removeAttribute( key );
 39.1088 +	},
 39.1089 +	addClass: function(c){
 39.1090 +		jQuery.className.add(this,c);
 39.1091 +	},
 39.1092 +	removeClass: function(c){
 39.1093 +		jQuery.className.remove(this,c);
 39.1094 +	},
 39.1095 +	toggleClass: function( c ){
 39.1096 +		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
 39.1097 +	},
 39.1098 +	remove: function(a){
 39.1099 +		if ( !a || jQuery.filter( a, [this] ).r.length ) {
 39.1100 +			jQuery.removeData( this );
 39.1101 +			this.parentNode.removeChild( this );
 39.1102 +		}
 39.1103 +	},
 39.1104 +	empty: function() {
 39.1105 +		// Clean up the cache
 39.1106 +		jQuery("*", this).each(function(){ jQuery.removeData(this); });
 39.1107 +
 39.1108 +		while ( this.firstChild )
 39.1109 +			this.removeChild( this.firstChild );
 39.1110 +	}
 39.1111 +}, function(i,n){
 39.1112 +	jQuery.fn[ i ] = function() {
 39.1113 +		return this.each( n, arguments );
 39.1114 +	};
 39.1115 +});
 39.1116 +
 39.1117 +jQuery.each( [ "Height", "Width" ], function(i,name){
 39.1118 +	var n = name.toLowerCase();
 39.1119 +	
 39.1120 +	jQuery.fn[ n ] = function(h) {
 39.1121 +		return this[0] == window ?
 39.1122 +			jQuery.browser.safari && self["inner" + name] ||
 39.1123 +			jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
 39.1124 +			document.body["client" + name] :
 39.1125 +		
 39.1126 +			this[0] == document ?
 39.1127 +				Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
 39.1128 +        
 39.1129 +				h == undefined ?
 39.1130 +					( this.length ? jQuery.css( this[0], n ) : null ) :
 39.1131 +					this.css( n, h.constructor == String ? h : h + "px" );
 39.1132 +	};
 39.1133 +});
 39.1134 +
 39.1135 +var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
 39.1136 +		"(?:[\\w*_-]|\\\\.)" :
 39.1137 +		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
 39.1138 +	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
 39.1139 +	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
 39.1140 +	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
 39.1141 +
 39.1142 +jQuery.extend({
 39.1143 +	expr: {
 39.1144 +		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
 39.1145 +		"#": "a.getAttribute('id')==m[2]",
 39.1146 +		":": {
 39.1147 +			// Position Checks
 39.1148 +			lt: "i<m[3]-0",
 39.1149 +			gt: "i>m[3]-0",
 39.1150 +			nth: "m[3]-0==i",
 39.1151 +			eq: "m[3]-0==i",
 39.1152 +			first: "i==0",
 39.1153 +			last: "i==r.length-1",
 39.1154 +			even: "i%2==0",
 39.1155 +			odd: "i%2",
 39.1156 +
 39.1157 +			// Child Checks
 39.1158 +			"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
 39.1159 +			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
 39.1160 +			"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
 39.1161 +
 39.1162 +			// Parent Checks
 39.1163 +			parent: "a.firstChild",
 39.1164 +			empty: "!a.firstChild",
 39.1165 +
 39.1166 +			// Text Check
 39.1167 +			contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
 39.1168 +
 39.1169 +			// Visibility
 39.1170 +			visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
 39.1171 +			hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
 39.1172 +
 39.1173 +			// Form attributes
 39.1174 +			enabled: "!a.disabled",
 39.1175 +			disabled: "a.disabled",
 39.1176 +			checked: "a.checked",
 39.1177 +			selected: "a.selected||jQuery.attr(a,'selected')",
 39.1178 +
 39.1179 +			// Form elements
 39.1180 +			text: "'text'==a.type",
 39.1181 +			radio: "'radio'==a.type",
 39.1182 +			checkbox: "'checkbox'==a.type",
 39.1183 +			file: "'file'==a.type",
 39.1184 +			password: "'password'==a.type",
 39.1185 +			submit: "'submit'==a.type",
 39.1186 +			image: "'image'==a.type",
 39.1187 +			reset: "'reset'==a.type",
 39.1188 +			button: '"button"==a.type||jQuery.nodeName(a,"button")',
 39.1189 +			input: "/input|select|textarea|button/i.test(a.nodeName)",
 39.1190 +
 39.1191 +			// :has()
 39.1192 +			has: "jQuery.find(m[3],a).length",
 39.1193 +
 39.1194 +			// :header
 39.1195 +			header: "/h\\d/i.test(a.nodeName)",
 39.1196 +
 39.1197 +			// :animated
 39.1198 +			animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
 39.1199 +		}
 39.1200 +	},
 39.1201 +	
 39.1202 +	// The regular expressions that power the parsing engine
 39.1203 +	parse: [
 39.1204 +		// Match: [@value='test'], [@foo]
 39.1205 +		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 39.1206 +
 39.1207 +		// Match: :contains('foo')
 39.1208 +		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 39.1209 +
 39.1210 +		// Match: :even, :last-chlid, #id, .class
 39.1211 +		new RegExp("^([:.#]*)(" + chars + "+)")
 39.1212 +	],
 39.1213 +
 39.1214 +	multiFilter: function( expr, elems, not ) {
 39.1215 +		var old, cur = [];
 39.1216 +
 39.1217 +		while ( expr && expr != old ) {
 39.1218 +			old = expr;
 39.1219 +			var f = jQuery.filter( expr, elems, not );
 39.1220 +			expr = f.t.replace(/^\s*,\s*/, "" );
 39.1221 +			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
 39.1222 +		}
 39.1223 +
 39.1224 +		return cur;
 39.1225 +	},
 39.1226 +
 39.1227 +	find: function( t, context ) {
 39.1228 +		// Quickly handle non-string expressions
 39.1229 +		if ( typeof t != "string" )
 39.1230 +			return [ t ];
 39.1231 +
 39.1232 +		// Make sure that the context is a DOM Element
 39.1233 +		if ( context && !context.nodeType )
 39.1234 +			context = null;
 39.1235 +
 39.1236 +		// Set the correct context (if none is provided)
 39.1237 +		context = context || document;
 39.1238 +
 39.1239 +		// Initialize the search
 39.1240 +		var ret = [context], done = [], last;
 39.1241 +
 39.1242 +		// Continue while a selector expression exists, and while
 39.1243 +		// we're no longer looping upon ourselves
 39.1244 +		while ( t && last != t ) {
 39.1245 +			var r = [];
 39.1246 +			last = t;
 39.1247 +
 39.1248 +			t = jQuery.trim(t);
 39.1249 +
 39.1250 +			var foundToken = false;
 39.1251 +
 39.1252 +			// An attempt at speeding up child selectors that
 39.1253 +			// point to a specific element tag
 39.1254 +			var re = quickChild;
 39.1255 +			var m = re.exec(t);
 39.1256 +
 39.1257 +			if ( m ) {
 39.1258 +				var nodeName = m[1].toUpperCase();
 39.1259 +
 39.1260 +				// Perform our own iteration and filter
 39.1261 +				for ( var i = 0; ret[i]; i++ )
 39.1262 +					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
 39.1263 +						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
 39.1264 +							r.push( c );
 39.1265 +
 39.1266 +				ret = r;
 39.1267 +				t = t.replace( re, "" );
 39.1268 +				if ( t.indexOf(" ") == 0 ) continue;
 39.1269 +				foundToken = true;
 39.1270 +			} else {
 39.1271 +				re = /^([>+~])\s*(\w*)/i;
 39.1272 +
 39.1273 +				if ( (m = re.exec(t)) != null ) {
 39.1274 +					r = [];
 39.1275 +
 39.1276 +					var nodeName = m[2], merge = {};
 39.1277 +					m = m[1];
 39.1278 +
 39.1279 +					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
 39.1280 +						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
 39.1281 +						for ( ; n; n = n.nextSibling )
 39.1282 +							if ( n.nodeType == 1 ) {
 39.1283 +								var id = jQuery.data(n);
 39.1284 +
 39.1285 +								if ( m == "~" && merge[id] ) break;
 39.1286 +								
 39.1287 +								if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
 39.1288 +									if ( m == "~" ) merge[id] = true;
 39.1289 +									r.push( n );
 39.1290 +								}
 39.1291 +								
 39.1292 +								if ( m == "+" ) break;
 39.1293 +							}
 39.1294 +					}
 39.1295 +
 39.1296 +					ret = r;
 39.1297 +
 39.1298 +					// And remove the token
 39.1299 +					t = jQuery.trim( t.replace( re, "" ) );
 39.1300 +					foundToken = true;
 39.1301 +				}
 39.1302 +			}
 39.1303 +
 39.1304 +			// See if there's still an expression, and that we haven't already
 39.1305 +			// matched a token
 39.1306 +			if ( t && !foundToken ) {
 39.1307 +				// Handle multiple expressions
 39.1308 +				if ( !t.indexOf(",") ) {
 39.1309 +					// Clean the result set
 39.1310 +					if ( context == ret[0] ) ret.shift();
 39.1311 +
 39.1312 +					// Merge the result sets
 39.1313 +					done = jQuery.merge( done, ret );
 39.1314 +
 39.1315 +					// Reset the context
 39.1316 +					r = ret = [context];
 39.1317 +
 39.1318 +					// Touch up the selector string
 39.1319 +					t = " " + t.substr(1,t.length);
 39.1320 +
 39.1321 +				} else {
 39.1322 +					// Optimize for the case nodeName#idName
 39.1323 +					var re2 = quickID;
 39.1324 +					var m = re2.exec(t);
 39.1325 +					
 39.1326 +					// Re-organize the results, so that they're consistent
 39.1327 +					if ( m ) {
 39.1328 +					   m = [ 0, m[2], m[3], m[1] ];
 39.1329 +
 39.1330 +					} else {
 39.1331 +						// Otherwise, do a traditional filter check for
 39.1332 +						// ID, class, and element selectors
 39.1333 +						re2 = quickClass;
 39.1334 +						m = re2.exec(t);
 39.1335 +					}
 39.1336 +
 39.1337 +					m[2] = m[2].replace(/\\/g, "");
 39.1338 +
 39.1339 +					var elem = ret[ret.length-1];
 39.1340 +
 39.1341 +					// Try to do a global search by ID, where we can
 39.1342 +					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 39.1343 +						// Optimization for HTML document case
 39.1344 +						var oid = elem.getElementById(m[2]);
 39.1345 +						
 39.1346 +						// Do a quick check for the existence of the actual ID attribute
 39.1347 +						// to avoid selecting by the name attribute in IE
 39.1348 +						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
 39.1349 +						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
 39.1350 +							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
 39.1351 +
 39.1352 +						// Do a quick check for node name (where applicable) so
 39.1353 +						// that div#foo searches will be really fast
 39.1354 +						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 39.1355 +					} else {
 39.1356 +						// We need to find all descendant elements
 39.1357 +						for ( var i = 0; ret[i]; i++ ) {
 39.1358 +							// Grab the tag name being searched for
 39.1359 +							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 39.1360 +
 39.1361 +							// Handle IE7 being really dumb about <object>s
 39.1362 +							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 39.1363 +								tag = "param";
 39.1364 +
 39.1365 +							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
 39.1366 +						}
 39.1367 +
 39.1368 +						// It's faster to filter by class and be done with it
 39.1369 +						if ( m[1] == "." )
 39.1370 +							r = jQuery.classFilter( r, m[2] );
 39.1371 +
 39.1372 +						// Same with ID filtering
 39.1373 +						if ( m[1] == "#" ) {
 39.1374 +							var tmp = [];
 39.1375 +
 39.1376 +							// Try to find the element with the ID
 39.1377 +							for ( var i = 0; r[i]; i++ )
 39.1378 +								if ( r[i].getAttribute("id") == m[2] ) {
 39.1379 +									tmp = [ r[i] ];
 39.1380 +									break;
 39.1381 +								}
 39.1382 +
 39.1383 +							r = tmp;
 39.1384 +						}
 39.1385 +
 39.1386 +						ret = r;
 39.1387 +					}
 39.1388 +
 39.1389 +					t = t.replace( re2, "" );
 39.1390 +				}
 39.1391 +
 39.1392 +			}
 39.1393 +
 39.1394 +			// If a selector string still exists
 39.1395 +			if ( t ) {
 39.1396 +				// Attempt to filter it
 39.1397 +				var val = jQuery.filter(t,r);
 39.1398 +				ret = r = val.r;
 39.1399 +				t = jQuery.trim(val.t);
 39.1400 +			}
 39.1401 +		}
 39.1402 +
 39.1403 +		// An error occurred with the selector;
 39.1404 +		// just return an empty set instead
 39.1405 +		if ( t )
 39.1406 +			ret = [];
 39.1407 +
 39.1408 +		// Remove the root context
 39.1409 +		if ( ret && context == ret[0] )
 39.1410 +			ret.shift();
 39.1411 +
 39.1412 +		// And combine the results
 39.1413 +		done = jQuery.merge( done, ret );
 39.1414 +
 39.1415 +		return done;
 39.1416 +	},
 39.1417 +
 39.1418 +	classFilter: function(r,m,not){
 39.1419 +		m = " " + m + " ";
 39.1420 +		var tmp = [];
 39.1421 +		for ( var i = 0; r[i]; i++ ) {
 39.1422 +			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
 39.1423 +			if ( !not && pass || not && !pass )
 39.1424 +				tmp.push( r[i] );
 39.1425 +		}
 39.1426 +		return tmp;
 39.1427 +	},
 39.1428 +
 39.1429 +	filter: function(t,r,not) {
 39.1430 +		var last;
 39.1431 +
 39.1432 +		// Look for common filter expressions
 39.1433 +		while ( t  && t != last ) {
 39.1434 +			last = t;
 39.1435 +
 39.1436 +			var p = jQuery.parse, m;
 39.1437 +
 39.1438 +			for ( var i = 0; p[i]; i++ ) {
 39.1439 +				m = p[i].exec( t );
 39.1440 +
 39.1441 +				if ( m ) {
 39.1442 +					// Remove what we just matched
 39.1443 +					t = t.substring( m[0].length );
 39.1444 +
 39.1445 +					m[2] = m[2].replace(/\\/g, "");
 39.1446 +					break;
 39.1447 +				}
 39.1448 +			}
 39.1449 +
 39.1450 +			if ( !m )
 39.1451 +				break;
 39.1452 +
 39.1453 +			// :not() is a special case that can be optimized by
 39.1454 +			// keeping it out of the expression list
 39.1455 +			if ( m[1] == ":" && m[2] == "not" )
 39.1456 +				r = jQuery.filter(m[3], r, true).r;
 39.1457 +
 39.1458 +			// We can get a big speed boost by filtering by class here
 39.1459 +			else if ( m[1] == "." )
 39.1460 +				r = jQuery.classFilter(r, m[2], not);
 39.1461 +
 39.1462 +			else if ( m[1] == "[" ) {
 39.1463 +				var tmp = [], type = m[3];
 39.1464 +				
 39.1465 +				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 39.1466 +					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
 39.1467 +					
 39.1468 +					if ( z == null || /href|src|selected/.test(m[2]) )
 39.1469 +						z = jQuery.attr(a,m[2]) || '';
 39.1470 +
 39.1471 +					if ( (type == "" && !!z ||
 39.1472 +						 type == "=" && z == m[5] ||
 39.1473 +						 type == "!=" && z != m[5] ||
 39.1474 +						 type == "^=" && z && !z.indexOf(m[5]) ||
 39.1475 +						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
 39.1476 +						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
 39.1477 +							tmp.push( a );
 39.1478 +				}
 39.1479 +				
 39.1480 +				r = tmp;
 39.1481 +
 39.1482 +			// We can get a speed boost by handling nth-child here
 39.1483 +			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
 39.1484 +				var merge = {}, tmp = [],
 39.1485 +					test = /(\d*)n\+?(\d*)/.exec(
 39.1486 +						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
 39.1487 +						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
 39.1488 +					first = (test[1] || 1) - 0, last = test[2] - 0;
 39.1489 +
 39.1490 +				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 39.1491 +					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
 39.1492 +
 39.1493 +					if ( !merge[id] ) {
 39.1494 +						var c = 1;
 39.1495 +
 39.1496 +						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
 39.1497 +							if ( n.nodeType == 1 )
 39.1498 +								n.nodeIndex = c++;
 39.1499 +
 39.1500 +						merge[id] = true;
 39.1501 +					}
 39.1502 +
 39.1503 +					var add = false;
 39.1504 +
 39.1505 +					if ( first == 1 ) {
 39.1506 +						if ( last == 0 || node.nodeIndex == last )
 39.1507 +							add = true;
 39.1508 +					} else if ( (node.nodeIndex + last) % first == 0 )
 39.1509 +						add = true;
 39.1510 +
 39.1511 +					if ( add ^ not )
 39.1512 +						tmp.push( node );
 39.1513 +				}
 39.1514 +
 39.1515 +				r = tmp;
 39.1516 +
 39.1517 +			// Otherwise, find the expression to execute
 39.1518 +			} else {
 39.1519 +				var f = jQuery.expr[m[1]];
 39.1520 +				if ( typeof f != "string" )
 39.1521 +					f = jQuery.expr[m[1]][m[2]];
 39.1522 +
 39.1523 +				// Build a custom macro to enclose it
 39.1524 +				f = eval("false||function(a,i){return " + f + "}");
 39.1525 +
 39.1526 +				// Execute it against the current filter
 39.1527 +				r = jQuery.grep( r, f, not );
 39.1528 +			}
 39.1529 +		}
 39.1530 +
 39.1531 +		// Return an array of filtered elements (r)
 39.1532 +		// and the modified expression string (t)
 39.1533 +		return { r: r, t: t };
 39.1534 +	},
 39.1535 +
 39.1536 +	dir: function( elem, dir ){
 39.1537 +		var matched = [];
 39.1538 +		var cur = elem[dir];
 39.1539 +		while ( cur && cur != document ) {
 39.1540 +			if ( cur.nodeType == 1 )
 39.1541 +				matched.push( cur );
 39.1542 +			cur = cur[dir];
 39.1543 +		}
 39.1544 +		return matched;
 39.1545 +	},
 39.1546 +	
 39.1547 +	nth: function(cur,result,dir,elem){
 39.1548 +		result = result || 1;
 39.1549 +		var num = 0;
 39.1550 +
 39.1551 +		for ( ; cur; cur = cur[dir] )
 39.1552 +			if ( cur.nodeType == 1 && ++num == result )
 39.1553 +				break;
 39.1554 +
 39.1555 +		return cur;
 39.1556 +	},
 39.1557 +	
 39.1558 +	sibling: function( n, elem ) {
 39.1559 +		var r = [];
 39.1560 +
 39.1561 +		for ( ; n; n = n.nextSibling ) {
 39.1562 +			if ( n.nodeType == 1 && (!elem || n != elem) )
 39.1563 +				r.push( n );
 39.1564 +		}
 39.1565 +
 39.1566 +		return r;
 39.1567 +	}
 39.1568 +});
 39.1569 +/*
 39.1570 + * A number of helper functions used for managing events.
 39.1571 + * Many of the ideas behind this code orignated from 
 39.1572 + * Dean Edwards' addEvent library.
 39.1573 + */
 39.1574 +jQuery.event = {
 39.1575 +
 39.1576 +	// Bind an event to an element
 39.1577 +	// Original by Dean Edwards
 39.1578 +	add: function(element, type, handler, data) {
 39.1579 +		// For whatever reason, IE has trouble passing the window object
 39.1580 +		// around, causing it to be cloned in the process
 39.1581 +		if ( jQuery.browser.msie && element.setInterval != undefined )
 39.1582 +			element = window;
 39.1583 +
 39.1584 +		// Make sure that the function being executed has a unique ID
 39.1585 +		if ( !handler.guid )
 39.1586 +			handler.guid = this.guid++;
 39.1587 +			
 39.1588 +		// if data is passed, bind to handler 
 39.1589 +		if( data != undefined ) { 
 39.1590 +        		// Create temporary function pointer to original handler 
 39.1591 +			var fn = handler; 
 39.1592 +
 39.1593 +			// Create unique handler function, wrapped around original handler 
 39.1594 +			handler = function() { 
 39.1595 +				// Pass arguments and context to original handler 
 39.1596 +				return fn.apply(this, arguments); 
 39.1597 +			};
 39.1598 +
 39.1599 +			// Store data in unique handler 
 39.1600 +			handler.data = data;
 39.1601 +
 39.1602 +			// Set the guid of unique handler to the same of original handler, so it can be removed 
 39.1603 +			handler.guid = fn.guid;
 39.1604 +		}
 39.1605 +
 39.1606 +		// Namespaced event handlers
 39.1607 +		var parts = type.split(".");
 39.1608 +		type = parts[0];
 39.1609 +		handler.type = parts[1];
 39.1610 +
 39.1611 +		// Init the element's event structure
 39.1612 +		var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
 39.1613 +		
 39.1614 +		var handle = jQuery.data(element, "handle", function(){
 39.1615 +			// returned undefined or false
 39.1616 +			var val;
 39.1617 +
 39.1618 +			// Handle the second event of a trigger and when
 39.1619 +			// an event is called after a page has unloaded
 39.1620 +			if ( typeof jQuery == "undefined" || jQuery.event.triggered )
 39.1621 +				return val;
 39.1622 +			
 39.1623 +			val = jQuery.event.handle.apply(element, arguments);
 39.1624 +			
 39.1625 +			return val;
 39.1626 +		});
 39.1627 +
 39.1628 +		// Get the current list of functions bound to this event
 39.1629 +		var handlers = events[type];
 39.1630 +
 39.1631 +		// Init the event handler queue
 39.1632 +		if (!handlers) {
 39.1633 +			handlers = events[type] = {};	
 39.1634 +			
 39.1635 +			// And bind the global event handler to the element
 39.1636 +			if (element.addEventListener)
 39.1637 +				element.addEventListener(type, handle, false);
 39.1638 +			else
 39.1639 +				element.attachEvent("on" + type, handle);
 39.1640 +		}
 39.1641 +
 39.1642 +		// Add the function to the element's handler list
 39.1643 +		handlers[handler.guid] = handler;
 39.1644 +
 39.1645 +		// Keep track of which events have been used, for global triggering
 39.1646 +		this.global[type] = true;
 39.1647 +	},
 39.1648 +
 39.1649 +	guid: 1,
 39.1650 +	global: {},
 39.1651 +
 39.1652 +	// Detach an event or set of events from an element
 39.1653 +	remove: function(element, type, handler) {
 39.1654 +		var events = jQuery.data(element, "events"), ret, index;
 39.1655 +
 39.1656 +		// Namespaced event handlers
 39.1657 +		if ( typeof type == "string" ) {
 39.1658 +			var parts = type.split(".");
 39.1659 +			type = parts[0];
 39.1660 +		}
 39.1661 +
 39.1662 +		if ( events ) {
 39.1663 +			// type is actually an event object here
 39.1664 +			if ( type && type.type ) {
 39.1665 +				handler = type.handler;
 39.1666 +				type = type.type;
 39.1667 +			}
 39.1668 +			
 39.1669 +			if ( !type ) {
 39.1670 +				for ( type in events )
 39.1671 +					this.remove( element, type );
 39.1672 +
 39.1673 +			} else if ( events[type] ) {
 39.1674 +				// remove the given handler for the given type
 39.1675 +				if ( handler )
 39.1676 +					delete events[type][handler.guid];
 39.1677 +				
 39.1678 +				// remove all handlers for the given type
 39.1679 +				else
 39.1680 +					for ( handler in events[type] )
 39.1681 +						// Handle the removal of namespaced events
 39.1682 +						if ( !parts[1] || events[type][handler].type == parts[1] )
 39.1683 +							delete events[type][handler];
 39.1684 +
 39.1685 +				// remove generic event handler if no more handlers exist
 39.1686 +				for ( ret in events[type] ) break;
 39.1687 +				if ( !ret ) {
 39.1688 +					if (element.removeEventListener)
 39.1689 +						element.removeEventListener(type, jQuery.data(element, "handle"), false);
 39.1690 +					else
 39.1691 +						element.detachEvent("on" + type, jQuery.data(element, "handle"));
 39.1692 +					ret = null;
 39.1693 +					delete events[type];
 39.1694 +				}
 39.1695 +			}
 39.1696 +
 39.1697 +			// Remove the expando if it's no longer used
 39.1698 +			for ( ret in events ) break;
 39.1699 +			if ( !ret ) {
 39.1700 +				jQuery.removeData( element, "events" );
 39.1701 +				jQuery.removeData( element, "handle" );
 39.1702 +			}
 39.1703 +		}
 39.1704 +	},
 39.1705 +
 39.1706 +	trigger: function(type, data, element, donative, extra) {
 39.1707 +		// Clone the incoming data, if any
 39.1708 +		data = jQuery.makeArray(data || []);
 39.1709 +
 39.1710 +		// Handle a global trigger
 39.1711 +		if ( !element ) {
 39.1712 +			// Only trigger if we've ever bound an event for it
 39.1713 +			if ( this.global[type] )
 39.1714 +				jQuery("*").add([window, document]).trigger(type, data);
 39.1715 +
 39.1716 +		// Handle triggering a single element
 39.1717 +		} else {
 39.1718 +			var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
 39.1719 +				// Check to see if we need to provide a fake event, or not
 39.1720 +				evt = !data[0] || !data[0].preventDefault;
 39.1721 +			
 39.1722 +			// Pass along a fake event
 39.1723 +			if ( evt )
 39.1724 +				data.unshift( this.fix({ type: type, target: element }) );
 39.1725 +
 39.1726 +			// Enforce the right trigger type
 39.1727 +			data[0].type = type;
 39.1728 +
 39.1729 +			// Trigger the event
 39.1730 +			if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
 39.1731 +				val = jQuery.data(element, "handle").apply( element, data );
 39.1732 +
 39.1733 +			// Handle triggering native .onfoo handlers
 39.1734 +			if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
 39.1735 +				val = false;
 39.1736 +
 39.1737 +			// Extra functions don't get the custom event object
 39.1738 +			if ( evt )
 39.1739 +				data.shift();
 39.1740 +
 39.1741 +			// Handle triggering of extra function
 39.1742 +			if ( extra && extra.apply( element, data ) === false )
 39.1743 +				val = false;
 39.1744 +
 39.1745 +			// Trigger the native events (except for clicks on links)
 39.1746 +			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
 39.1747 +				this.triggered = true;
 39.1748 +				element[ type ]();
 39.1749 +			}
 39.1750 +
 39.1751 +			this.triggered = false;
 39.1752 +		}
 39.1753 +
 39.1754 +		return val;
 39.1755 +	},
 39.1756 +
 39.1757 +	handle: function(event) {
 39.1758 +		// returned undefined or false
 39.1759 +		var val;
 39.1760 +
 39.1761 +		// Empty object is for triggered events with no data
 39.1762 +		event = jQuery.event.fix( event || window.event || {} ); 
 39.1763 +
 39.1764 +		// Namespaced event handlers
 39.1765 +		var parts = event.type.split(".");
 39.1766 +		event.type = parts[0];
 39.1767 +
 39.1768 +		var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
 39.1769 +		args.unshift( event );
 39.1770 +
 39.1771 +		for ( var j in c ) {
 39.1772 +			// Pass in a reference to the handler function itself
 39.1773 +			// So that we can later remove it
 39.1774 +			args[0].handler = c[j];
 39.1775 +			args[0].data = c[j].data;
 39.1776 +
 39.1777 +			// Filter the functions by class
 39.1778 +			if ( !parts[1] || c[j].type == parts[1] ) {
 39.1779 +				var tmp = c[j].apply( this, args );
 39.1780 +
 39.1781 +				if ( val !== false )
 39.1782 +					val = tmp;
 39.1783 +
 39.1784 +				if ( tmp === false ) {
 39.1785 +					event.preventDefault();
 39.1786 +					event.stopPropagation();
 39.1787 +				}
 39.1788 +			}
 39.1789 +		}
 39.1790 +
 39.1791 +		// Clean up added properties in IE to prevent memory leak
 39.1792 +		if (jQuery.browser.msie)
 39.1793 +			event.target = event.preventDefault = event.stopPropagation =
 39.1794 +				event.handler = event.data = null;
 39.1795 +
 39.1796 +		return val;
 39.1797 +	},
 39.1798 +
 39.1799 +	fix: function(event) {
 39.1800 +		// store a copy of the original event object 
 39.1801 +		// and clone to set read-only properties
 39.1802 +		var originalEvent = event;
 39.1803 +		event = jQuery.extend({}, originalEvent);
 39.1804 +		
 39.1805 +		// add preventDefault and stopPropagation since 
 39.1806 +		// they will not work on the clone
 39.1807 +		event.preventDefault = function() {
 39.1808 +			// if preventDefault exists run it on the original event
 39.1809 +			if (originalEvent.preventDefault)
 39.1810 +				originalEvent.preventDefault();
 39.1811 +			// otherwise set the returnValue property of the original event to false (IE)
 39.1812 +			originalEvent.returnValue = false;
 39.1813 +		};
 39.1814 +		event.stopPropagation = function() {
 39.1815 +			// if stopPropagation exists run it on the original event
 39.1816 +			if (originalEvent.stopPropagation)
 39.1817 +				originalEvent.stopPropagation();
 39.1818 +			// otherwise set the cancelBubble property of the original event to true (IE)
 39.1819 +			originalEvent.cancelBubble = true;
 39.1820 +		};
 39.1821 +		
 39.1822 +		// Fix target property, if necessary
 39.1823 +		if ( !event.target && event.srcElement )
 39.1824 +			event.target = event.srcElement;
 39.1825 +				
 39.1826 +		// check if target is a textnode (safari)
 39.1827 +		if (jQuery.browser.safari && event.target.nodeType == 3)
 39.1828 +			event.target = originalEvent.target.parentNode;
 39.1829 +
 39.1830 +		// Add relatedTarget, if necessary
 39.1831 +		if ( !event.relatedTarget && event.fromElement )
 39.1832 +			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
 39.1833 +
 39.1834 +		// Calculate pageX/Y if missing and clientX/Y available
 39.1835 +		if ( event.pageX == null && event.clientX != null ) {
 39.1836 +			var e = document.documentElement, b = document.body;
 39.1837 +			event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
 39.1838 +			event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
 39.1839 +		}
 39.1840 +			
 39.1841 +		// Add which for key events
 39.1842 +		if ( !event.which && (event.charCode || event.keyCode) )
 39.1843 +			event.which = event.charCode || event.keyCode;
 39.1844 +		
 39.1845 +		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 39.1846 +		if ( !event.metaKey && event.ctrlKey )
 39.1847 +			event.metaKey = event.ctrlKey;
 39.1848 +
 39.1849 +		// Add which for click: 1 == left; 2 == middle; 3 == right
 39.1850 +		// Note: button is not normalized, so don't use it
 39.1851 +		if ( !event.which && event.button )
 39.1852 +			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 39.1853 +			
 39.1854 +		return event;
 39.1855 +	}
 39.1856 +};
 39.1857 +
 39.1858 +jQuery.fn.extend({
 39.1859 +	bind: function( type, data, fn ) {
 39.1860 +		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
 39.1861 +			jQuery.event.add( this, type, fn || data, fn && data );
 39.1862 +		});
 39.1863 +	},
 39.1864 +	
 39.1865 +	one: function( type, data, fn ) {
 39.1866 +		return this.each(function(){
 39.1867 +			jQuery.event.add( this, type, function(event) {
 39.1868 +				jQuery(this).unbind(event);
 39.1869 +				return (fn || data).apply( this, arguments);
 39.1870 +			}, fn && data);
 39.1871 +		});
 39.1872 +	},
 39.1873 +
 39.1874 +	unbind: function( type, fn ) {
 39.1875 +		return this.each(function(){
 39.1876 +			jQuery.event.remove( this, type, fn );
 39.1877 +		});
 39.1878 +	},
 39.1879 +
 39.1880 +	trigger: function( type, data, fn ) {
 39.1881 +		return this.each(function(){
 39.1882 +			jQuery.event.trigger( type, data, this, true, fn );
 39.1883 +		});
 39.1884 +	},
 39.1885 +
 39.1886 +	triggerHandler: function( type, data, fn ) {
 39.1887 +		if ( this[0] )
 39.1888 +			return jQuery.event.trigger( type, data, this[0], false, fn );
 39.1889 +	},
 39.1890 +
 39.1891 +	toggle: function() {
 39.1892 +		// Save reference to arguments for access in closure
 39.1893 +		var a = arguments;
 39.1894 +
 39.1895 +		return this.click(function(e) {
 39.1896 +			// Figure out which function to execute
 39.1897 +			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
 39.1898 +			
 39.1899 +			// Make sure that clicks stop
 39.1900 +			e.preventDefault();
 39.1901 +			
 39.1902 +			// and execute the function
 39.1903 +			return a[this.lastToggle].apply( this, [e] ) || false;
 39.1904 +		});
 39.1905 +	},
 39.1906 +
 39.1907 +	hover: function(f,g) {
 39.1908 +		
 39.1909 +		// A private function for handling mouse 'hovering'
 39.1910 +		function handleHover(e) {
 39.1911 +			// Check if mouse(over|out) are still within the same parent element
 39.1912 +			var p = e.relatedTarget;
 39.1913 +	
 39.1914 +			// Traverse up the tree
 39.1915 +			while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
 39.1916 +			
 39.1917 +			// If we actually just moused on to a sub-element, ignore it
 39.1918 +			if ( p == this ) return false;
 39.1919 +			
 39.1920 +			// Execute the right function
 39.1921 +			return (e.type == "mouseover" ? f : g).apply(this, [e]);
 39.1922 +		}
 39.1923 +		
 39.1924 +		// Bind the function to the two event listeners
 39.1925 +		return this.mouseover(handleHover).mouseout(handleHover);
 39.1926 +	},
 39.1927 +	
 39.1928 +	ready: function(f) {
 39.1929 +		// Attach the listeners
 39.1930 +		bindReady();
 39.1931 +
 39.1932 +		// If the DOM is already ready
 39.1933 +		if ( jQuery.isReady )
 39.1934 +			// Execute the function immediately
 39.1935 +			f.apply( document, [jQuery] );
 39.1936 +			
 39.1937 +		// Otherwise, remember the function for later
 39.1938 +		else
 39.1939 +			// Add the function to the wait list
 39.1940 +			jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
 39.1941 +	
 39.1942 +		return this;
 39.1943 +	}
 39.1944 +});
 39.1945 +
 39.1946 +jQuery.extend({
 39.1947 +	/*
 39.1948 +	 * All the code that makes DOM Ready work nicely.
 39.1949 +	 */
 39.1950 +	isReady: false,
 39.1951 +	readyList: [],
 39.1952 +	
 39.1953 +	// Handle when the DOM is ready
 39.1954 +	ready: function() {
 39.1955 +		// Make sure that the DOM is not already loaded
 39.1956 +		if ( !jQuery.isReady ) {
 39.1957 +			// Remember that the DOM is ready
 39.1958 +			jQuery.isReady = true;
 39.1959 +			
 39.1960 +			// If there are functions bound, to execute
 39.1961 +			if ( jQuery.readyList ) {
 39.1962 +				// Execute all of them
 39.1963 +				jQuery.each( jQuery.readyList, function(){
 39.1964 +					this.apply( document );
 39.1965 +				});
 39.1966 +				
 39.1967 +				// Reset the list of functions
 39.1968 +				jQuery.readyList = null;
 39.1969 +			}
 39.1970 +			// Remove event listener to avoid memory leak
 39.1971 +			if ( jQuery.browser.mozilla || jQuery.browser.opera )
 39.1972 +				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
 39.1973 +			
 39.1974 +			// Remove script element used by IE hack
 39.1975 +			if( !window.frames.length ) // don't remove if frames are present (#1187)
 39.1976 +				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
 39.1977 +		}
 39.1978 +	}
 39.1979 +});
 39.1980 +
 39.1981 +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
 39.1982 +	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
 39.1983 +	"submit,keydown,keypress,keyup,error").split(","), function(i,o){
 39.1984 +	
 39.1985 +	// Handle event binding
 39.1986 +	jQuery.fn[o] = function(f){
 39.1987 +		return f ? this.bind(o, f) : this.trigger(o);
 39.1988 +	};
 39.1989 +});
 39.1990 +
 39.1991 +var readyBound = false;
 39.1992 +
 39.1993 +function bindReady(){
 39.1994 +	if ( readyBound ) return;
 39.1995 +	readyBound = true;
 39.1996 +
 39.1997 +	// If Mozilla is used
 39.1998 +	if ( jQuery.browser.mozilla || jQuery.browser.opera )
 39.1999 +		// Use the handy event callback
 39.2000 +		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
 39.2001 +	
 39.2002 +	// If IE is used, use the excellent hack by Matthias Miller
 39.2003 +	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
 39.2004 +	else if ( jQuery.browser.msie ) {
 39.2005 +	
 39.2006 +		// Only works if you document.write() it
 39.2007 +		document.write("<scr" + "ipt id=__ie_init defer=true " + 
 39.2008 +			"src=//:><\/script>");
 39.2009 +	
 39.2010 +		// Use the defer script hack
 39.2011 +		var script = document.getElementById("__ie_init");
 39.2012 +		
 39.2013 +		// script does not exist if jQuery is loaded dynamically
 39.2014 +		if ( script ) 
 39.2015 +			script.onreadystatechange = function() {
 39.2016 +				if ( this.readyState != "complete" ) return;
 39.2017 +				jQuery.ready();
 39.2018 +			};
 39.2019 +	
 39.2020 +		// Clear from memory
 39.2021 +		script = null;
 39.2022 +	
 39.2023 +	// If Safari  is used
 39.2024 +	} else if ( jQuery.browser.safari )
 39.2025 +		// Continually check to see if the document.readyState is valid
 39.2026 +		jQuery.safariTimer = setInterval(function(){
 39.2027 +			// loaded and complete are both valid states
 39.2028 +			if ( document.readyState == "loaded" || 
 39.2029 +				document.readyState == "complete" ) {
 39.2030 +	
 39.2031 +				// If either one are found, remove the timer
 39.2032 +				clearInterval( jQuery.safariTimer );
 39.2033 +				jQuery.safariTimer = null;
 39.2034 +	
 39.2035 +				// and execute any waiting functions
 39.2036 +				jQuery.ready();
 39.2037 +			}
 39.2038 +		}, 10); 
 39.2039 +
 39.2040 +	// A fallback to window.onload, that will always work
 39.2041 +	jQuery.event.add( window, "load", jQuery.ready );
 39.2042 +}
 39.2043 +jQuery.fn.extend({
 39.2044 +	load: function( url, params, callback ) {
 39.2045 +		if ( jQuery.isFunction( url ) )
 39.2046 +			return this.bind("load", url);
 39.2047 +
 39.2048 +		var off = url.indexOf(" ");
 39.2049 +		if ( off >= 0 ) {
 39.2050 +			var selector = url.slice(off, url.length);
 39.2051 +			url = url.slice(0, off);
 39.2052 +		}
 39.2053 +
 39.2054 +		callback = callback || function(){};
 39.2055 +
 39.2056 +		// Default to a GET request
 39.2057 +		var type = "GET";
 39.2058 +
 39.2059 +		// If the second parameter was provided
 39.2060 +		if ( params )
 39.2061 +			// If it's a function
 39.2062 +			if ( jQuery.isFunction( params ) ) {
 39.2063 +				// We assume that it's the callback
 39.2064 +				callback = params;
 39.2065 +				params = null;
 39.2066 +
 39.2067 +			// Otherwise, build a param string
 39.2068 +			} else {
 39.2069 +				params = jQuery.param( params );
 39.2070 +				type = "POST";
 39.2071 +			}
 39.2072 +
 39.2073 +		var self = this;
 39.2074 +
 39.2075 +		// Request the remote document
 39.2076 +		jQuery.ajax({
 39.2077 +			url: url,
 39.2078 +			type: type,
 39.2079 +			data: params,
 39.2080 +			complete: function(res, status){
 39.2081 +				// If successful, inject the HTML into all the matched elements
 39.2082 +				if ( status == "success" || status == "notmodified" )
 39.2083 +					// See if a selector was specified
 39.2084 +					self.html( selector ?
 39.2085 +						// Create a dummy div to hold the results
 39.2086 +						jQuery("<div/>")
 39.2087 +							// inject the contents of the document in, removing the scripts
 39.2088 +							// to avoid any 'Permission Denied' errors in IE
 39.2089 +							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
 39.2090 +
 39.2091 +							// Locate the specified elements
 39.2092 +							.find(selector) :
 39.2093 +
 39.2094 +						// If not, just inject the full result
 39.2095 +						res.responseText );
 39.2096 +
 39.2097 +				// Add delay to account for Safari's delay in globalEval
 39.2098 +				setTimeout(function(){
 39.2099 +					self.each( callback, [res.responseText, status, res] );
 39.2100 +				}, 13);
 39.2101 +			}
 39.2102 +		});
 39.2103 +		return this;
 39.2104 +	},
 39.2105 +
 39.2106 +	serialize: function() {
 39.2107 +		return jQuery.param(this.serializeArray());
 39.2108 +	},
 39.2109 +	serializeArray: function() {
 39.2110 +		return this.map(function(){
 39.2111 +			return jQuery.nodeName(this, "form") ?
 39.2112 +				jQuery.makeArray(this.elements) : this;
 39.2113 +		})
 39.2114 +		.filter(function(){
 39.2115 +			return this.name && !this.disabled && 
 39.2116 +				(this.checked || /select|textarea/i.test(this.nodeName) || 
 39.2117 +					/text|hidden|password/i.test(this.type));
 39.2118 +		})
 39.2119 +		.map(function(i, elem){
 39.2120 +			var val = jQuery(this).val();
 39.2121 +			return val == null ? null :
 39.2122 +				val.constructor == Array ?
 39.2123 +					jQuery.map( val, function(val, i){
 39.2124 +						return {name: elem.name, value: val};
 39.2125 +					}) :
 39.2126 +					{name: elem.name, value: val};
 39.2127 +		}).get();
 39.2128 +	}
 39.2129 +});
 39.2130 +
 39.2131 +// Attach a bunch of functions for handling common AJAX events
 39.2132 +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 39.2133 +	jQuery.fn[o] = function(f){
 39.2134 +		return this.bind(o, f);
 39.2135 +	};
 39.2136 +});
 39.2137 +
 39.2138 +var jsc = (new Date).getTime();
 39.2139 +
 39.2140 +jQuery.extend({
 39.2141 +	get: function( url, data, callback, type ) {
 39.2142 +		// shift arguments if data argument was ommited
 39.2143 +		if ( jQuery.isFunction( data ) ) {
 39.2144 +			callback = data;
 39.2145 +			data = null;
 39.2146 +		}
 39.2147 +		
 39.2148 +		return jQuery.ajax({
 39.2149 +			type: "GET",
 39.2150 +			url: url,
 39.2151 +			data: data,
 39.2152 +			success: callback,
 39.2153 +			dataType: type
 39.2154 +		});
 39.2155 +	},
 39.2156 +
 39.2157 +	getScript: function( url, callback ) {
 39.2158 +		return jQuery.get(url, null, callback, "script");
 39.2159 +	},
 39.2160 +
 39.2161 +	getJSON: function( url, data, callback ) {
 39.2162 +		return jQuery.get(url, data, callback, "json");
 39.2163 +	},
 39.2164 +
 39.2165 +	post: function( url, data, callback, type ) {
 39.2166 +		if ( jQuery.isFunction( data ) ) {
 39.2167 +			callback = data;
 39.2168 +			data = {};
 39.2169 +		}
 39.2170 +
 39.2171 +		return jQuery.ajax({
 39.2172 +			type: "POST",
 39.2173 +			url: url,
 39.2174 +			data: data,
 39.2175 +			success: callback,
 39.2176 +			dataType: type
 39.2177 +		});
 39.2178 +	},
 39.2179 +
 39.2180 +	ajaxSetup: function( settings ) {
 39.2181 +		jQuery.extend( jQuery.ajaxSettings, settings );
 39.2182 +	},
 39.2183 +
 39.2184 +	ajaxSettings: {
 39.2185 +		global: true,
 39.2186 +		type: "GET",
 39.2187 +		timeout: 0,
 39.2188 +		contentType: "application/x-www-form-urlencoded",
 39.2189 +		processData: true,
 39.2190 +		async: true,
 39.2191 +		data: null
 39.2192 +	},
 39.2193 +	
 39.2194 +	// Last-Modified header cache for next request
 39.2195 +	lastModified: {},
 39.2196 +
 39.2197 +	ajax: function( s ) {
 39.2198 +		var jsonp, jsre = /=(\?|%3F)/g, status, data;
 39.2199 +
 39.2200 +		// Extend the settings, but re-extend 's' so that it can be
 39.2201 +		// checked again later (in the test suite, specifically)
 39.2202 +		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 39.2203 +
 39.2204 +		// convert data if not already a string
 39.2205 +		if ( s.data && s.processData && typeof s.data != "string" )
 39.2206 +			s.data = jQuery.param(s.data);
 39.2207 +
 39.2208 +		// Handle JSONP Parameter Callbacks
 39.2209 +		if ( s.dataType == "jsonp" ) {
 39.2210 +			if ( s.type.toLowerCase() == "get" ) {
 39.2211 +				if ( !s.url.match(jsre) )
 39.2212 +					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
 39.2213 +			} else if ( !s.data || !s.data.match(jsre) )
 39.2214 +				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
 39.2215 +			s.dataType = "json";
 39.2216 +		}
 39.2217 +
 39.2218 +		// Build temporary JSONP function
 39.2219 +		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
 39.2220 +			jsonp = "jsonp" + jsc++;
 39.2221 +
 39.2222 +			// Replace the =? sequence both in the query string and the data
 39.2223 +			if ( s.data )
 39.2224 +				s.data = s.data.replace(jsre, "=" + jsonp);
 39.2225 +			s.url = s.url.replace(jsre, "=" + jsonp);
 39.2226 +
 39.2227 +			// We need to make sure
 39.2228 +			// that a JSONP style response is executed properly
 39.2229 +			s.dataType = "script";
 39.2230 +
 39.2231 +			// Handle JSONP-style loading
 39.2232 +			window[ jsonp ] = function(tmp){
 39.2233 +				data = tmp;
 39.2234 +				success();
 39.2235 +				complete();
 39.2236 +				// Garbage collect
 39.2237 +				window[ jsonp ] = undefined;
 39.2238 +				try{ delete window[ jsonp ]; } catch(e){}
 39.2239 +			};
 39.2240 +		}
 39.2241 +
 39.2242 +		if ( s.dataType == "script" && s.cache == null )
 39.2243 +			s.cache = false;
 39.2244 +
 39.2245 +		if ( s.cache === false && s.type.toLowerCase() == "get" )
 39.2246 +			s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
 39.2247 +
 39.2248 +		// If data is available, append data to url for get requests
 39.2249 +		if ( s.data && s.type.toLowerCase() == "get" ) {
 39.2250 +			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
 39.2251 +
 39.2252 +			// IE likes to send both get and post data, prevent this
 39.2253 +			s.data = null;
 39.2254 +		}
 39.2255 +
 39.2256 +		// Watch for a new set of requests
 39.2257 +		if ( s.global && ! jQuery.active++ )
 39.2258 +			jQuery.event.trigger( "ajaxStart" );
 39.2259 +
 39.2260 +		// If we're requesting a remote document
 39.2261 +		// and trying to load JSON or Script
 39.2262 +		if ( !s.url.indexOf("http") && s.dataType == "script" ) {
 39.2263 +			var head = document.getElementsByTagName("head")[0];
 39.2264 +			var script = document.createElement("script");
 39.2265 +			script.src = s.url;
 39.2266 +
 39.2267 +			// Handle Script loading
 39.2268 +			if ( !jsonp && (s.success || s.complete) ) {
 39.2269 +				var done = false;
 39.2270 +
 39.2271 +				// Attach handlers for all browsers
 39.2272 +				script.onload = script.onreadystatechange = function(){
 39.2273 +					if ( !done && (!this.readyState || 
 39.2274 +							this.readyState == "loaded" || this.readyState == "complete") ) {
 39.2275 +						done = true;
 39.2276 +						success();
 39.2277 +						complete();
 39.2278 +						head.removeChild( script );
 39.2279 +					}
 39.2280 +				};
 39.2281 +			}
 39.2282 +
 39.2283 +			head.appendChild(script);
 39.2284 +
 39.2285 +			// We handle everything using the script element injection
 39.2286 +			return;
 39.2287 +		}
 39.2288 +
 39.2289 +		var requestDone = false;
 39.2290 +
 39.2291 +		// Create the request object; Microsoft failed to properly
 39.2292 +		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
 39.2293 +		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 39.2294 +
 39.2295 +		// Open the socket
 39.2296 +		xml.open(s.type, s.url, s.async);
 39.2297 +
 39.2298 +		// Set the correct header, if data is being sent
 39.2299 +		if ( s.data )
 39.2300 +			xml.setRequestHeader("Content-Type", s.contentType);
 39.2301 +
 39.2302 +		// Set the If-Modified-Since header, if ifModified mode.
 39.2303 +		if ( s.ifModified )
 39.2304 +			xml.setRequestHeader("If-Modified-Since",
 39.2305 +				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 39.2306 +
 39.2307 +		// Set header so the called script knows that it's an XMLHttpRequest
 39.2308 +		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 39.2309 +
 39.2310 +		// Allow custom headers/mimetypes
 39.2311 +		if ( s.beforeSend )
 39.2312 +			s.beforeSend(xml);
 39.2313 +			
 39.2314 +		if ( s.global )
 39.2315 +		    jQuery.event.trigger("ajaxSend", [xml, s]);
 39.2316 +
 39.2317 +		// Wait for a response to come back
 39.2318 +		var onreadystatechange = function(isTimeout){
 39.2319 +			// The transfer is complete and the data is available, or the request timed out
 39.2320 +			if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
 39.2321 +				requestDone = true;
 39.2322 +				
 39.2323 +				// clear poll interval
 39.2324 +				if (ival) {
 39.2325 +					clearInterval(ival);
 39.2326 +					ival = null;
 39.2327 +				}
 39.2328 +				
 39.2329 +				status = isTimeout == "timeout" && "timeout" ||
 39.2330 +					!jQuery.httpSuccess( xml ) && "error" ||
 39.2331 +					s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
 39.2332 +					"success";
 39.2333 +
 39.2334 +				if ( status == "success" ) {
 39.2335 +					// Watch for, and catch, XML document parse errors
 39.2336 +					try {
 39.2337 +						// process the data (runs the xml through httpData regardless of callback)
 39.2338 +						data = jQuery.httpData( xml, s.dataType );
 39.2339 +					} catch(e) {
 39.2340 +						status = "parsererror";
 39.2341 +					}
 39.2342 +				}
 39.2343 +
 39.2344 +				// Make sure that the request was successful or notmodified
 39.2345 +				if ( status == "success" ) {
 39.2346 +					// Cache Last-Modified header, if ifModified mode.
 39.2347 +					var modRes;
 39.2348 +					try {
 39.2349 +						modRes = xml.getResponseHeader("Last-Modified");
 39.2350 +					} catch(e) {} // swallow exception thrown by FF if header is not available
 39.2351 +	
 39.2352 +					if ( s.ifModified && modRes )
 39.2353 +						jQuery.lastModified[s.url] = modRes;
 39.2354 +
 39.2355 +					// JSONP handles its own success callback
 39.2356 +					if ( !jsonp )
 39.2357 +						success();	
 39.2358 +				} else
 39.2359 +					jQuery.handleError(s, xml, status);
 39.2360 +
 39.2361 +				// Fire the complete handlers
 39.2362 +				complete();
 39.2363 +
 39.2364 +				// Stop memory leaks
 39.2365 +				if ( s.async )
 39.2366 +					xml = null;
 39.2367 +			}
 39.2368 +		};
 39.2369 +		
 39.2370 +		if ( s.async ) {
 39.2371 +			// don't attach the handler to the request, just poll it instead
 39.2372 +			var ival = setInterval(onreadystatechange, 13); 
 39.2373 +
 39.2374 +			// Timeout checker
 39.2375 +			if ( s.timeout > 0 )
 39.2376 +				setTimeout(function(){
 39.2377 +					// Check to see if the request is still happening
 39.2378 +					if ( xml ) {
 39.2379 +						// Cancel the request
 39.2380 +						xml.abort();
 39.2381 +	
 39.2382 +						if( !requestDone )
 39.2383 +							onreadystatechange( "timeout" );
 39.2384 +					}
 39.2385 +				}, s.timeout);
 39.2386 +		}
 39.2387 +			
 39.2388 +		// Send the data
 39.2389 +		try {
 39.2390 +			xml.send(s.data);
 39.2391 +		} catch(e) {
 39.2392 +			jQuery.handleError(s, xml, null, e);
 39.2393 +		}
 39.2394 +		
 39.2395 +		// firefox 1.5 doesn't fire statechange for sync requests
 39.2396 +		if ( !s.async )
 39.2397 +			onreadystatechange();
 39.2398 +		
 39.2399 +		// return XMLHttpRequest to allow aborting the request etc.
 39.2400 +		return xml;
 39.2401 +
 39.2402 +		function success(){
 39.2403 +			// If a local callback was specified, fire it and pass it the data
 39.2404 +			if ( s.success )
 39.2405 +				s.success( data, status );
 39.2406 +
 39.2407 +			// Fire the global callback
 39.2408 +			if ( s.global )
 39.2409 +				jQuery.event.trigger( "ajaxSuccess", [xml, s] );
 39.2410 +		}
 39.2411 +
 39.2412 +		function complete(){
 39.2413 +			// Process result
 39.2414 +			if ( s.complete )
 39.2415 +				s.complete(xml, status);
 39.2416 +
 39.2417 +			// The request was completed
 39.2418 +			if ( s.global )
 39.2419 +				jQuery.event.trigger( "ajaxComplete", [xml, s] );
 39.2420 +
 39.2421 +			// Handle the global AJAX counter
 39.2422 +			if ( s.global && ! --jQuery.active )
 39.2423 +				jQuery.event.trigger( "ajaxStop" );
 39.2424 +		}
 39.2425 +	},
 39.2426 +
 39.2427 +	handleError: function( s, xml, status, e ) {
 39.2428 +		// If a local callback was specified, fire it
 39.2429 +		if ( s.error ) s.error( xml, status, e );
 39.2430 +
 39.2431 +		// Fire the global callback
 39.2432 +		if ( s.global )
 39.2433 +			jQuery.event.trigger( "ajaxError", [xml, s, e] );
 39.2434 +	},
 39.2435 +
 39.2436 +	// Counter for holding the number of active queries
 39.2437 +	active: 0,
 39.2438 +
 39.2439 +	// Determines if an XMLHttpRequest was successful or not
 39.2440 +	httpSuccess: function( r ) {
 39.2441 +		try {
 39.2442 +			return !r.status && location.protocol == "file:" ||
 39.2443 +				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
 39.2444 +				jQuery.browser.safari && r.status == undefined;
 39.2445 +		} catch(e){}
 39.2446 +		return false;
 39.2447 +	},
 39.2448 +
 39.2449 +	// Determines if an XMLHttpRequest returns NotModified
 39.2450 +	httpNotModified: function( xml, url ) {
 39.2451 +		try {
 39.2452 +			var xmlRes = xml.getResponseHeader("Last-Modified");
 39.2453 +
 39.2454 +			// Firefox always returns 200. check Last-Modified date
 39.2455 +			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
 39.2456 +				jQuery.browser.safari && xml.status == undefined;
 39.2457 +		} catch(e){}
 39.2458 +		return false;
 39.2459 +	},
 39.2460 +
 39.2461 +	httpData: function( r, type ) {
 39.2462 +		var ct = r.getResponseHeader("content-type");
 39.2463 +		var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
 39.2464 +		var data = xml ? r.responseXML : r.responseText;
 39.2465 +
 39.2466 +		if ( xml && data.documentElement.tagName == "parsererror" )
 39.2467 +			throw "parsererror";
 39.2468 +
 39.2469 +		// If the type is "script", eval it in global context
 39.2470 +		if ( type == "script" )
 39.2471 +			jQuery.globalEval( data );
 39.2472 +
 39.2473 +		// Get the JavaScript object, if JSON is used.
 39.2474 +		if ( type == "json" )
 39.2475 +			data = eval("(" + data + ")");
 39.2476 +
 39.2477 +		return data;
 39.2478 +	},
 39.2479 +
 39.2480 +	// Serialize an array of form elements or a set of
 39.2481 +	// key/values into a query string
 39.2482 +	param: function( a ) {
 39.2483 +		var s = [];
 39.2484 +
 39.2485 +		// If an array was passed in, assume that it is an array
 39.2486 +		// of form elements
 39.2487 +		if ( a.constructor == Array || a.jquery )
 39.2488 +			// Serialize the form elements
 39.2489 +			jQuery.each( a, function(){
 39.2490 +				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
 39.2491 +			});
 39.2492 +
 39.2493 +		// Otherwise, assume that it's an object of key/value pairs
 39.2494 +		else
 39.2495 +			// Serialize the key/values
 39.2496 +			for ( var j in a )
 39.2497 +				// If the value is an array then the key names need to be repeated
 39.2498 +				if ( a[j] && a[j].constructor == Array )
 39.2499 +					jQuery.each( a[j], function(){
 39.2500 +						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 39.2501 +					});
 39.2502 +				else
 39.2503 +					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
 39.2504 +
 39.2505 +		// Return the resulting serialization
 39.2506 +		return s.join("&").replace(/%20/g, "+");
 39.2507 +	}
 39.2508 +
 39.2509 +});
 39.2510 +jQuery.fn.extend({
 39.2511 +	show: function(speed,callback){
 39.2512 +		return speed ?
 39.2513 +			this.animate({
 39.2514 +				height: "show", width: "show", opacity: "show"
 39.2515 +			}, speed, callback) :
 39.2516 +			
 39.2517 +			this.filter(":hidden").each(function(){
 39.2518 +				this.style.display = this.oldblock ? this.oldblock : "";
 39.2519 +				if ( jQuery.css(this,"display") == "none" )
 39.2520 +					this.style.display = "block";
 39.2521 +			}).end();
 39.2522 +	},
 39.2523 +	
 39.2524 +	hide: function(speed,callback){
 39.2525 +		return speed ?
 39.2526 +			this.animate({
 39.2527 +				height: "hide", width: "hide", opacity: "hide"
 39.2528 +			}, speed, callback) :
 39.2529 +			
 39.2530 +			this.filter(":visible").each(function(){
 39.2531 +				this.oldblock = this.oldblock || jQuery.css(this,"display");
 39.2532 +				if ( this.oldblock == "none" )
 39.2533 +					this.oldblock = "block";
 39.2534 +				this.style.display = "none";
 39.2535 +			}).end();
 39.2536 +	},
 39.2537 +
 39.2538 +	// Save the old toggle function
 39.2539 +	_toggle: jQuery.fn.toggle,
 39.2540 +	
 39.2541 +	toggle: function( fn, fn2 ){
 39.2542 +		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
 39.2543 +			this._toggle( fn, fn2 ) :
 39.2544 +			fn ?
 39.2545 +				this.animate({
 39.2546 +					height: "toggle", width: "toggle", opacity: "toggle"
 39.2547 +				}, fn, fn2) :
 39.2548 +				this.each(function(){
 39.2549 +					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
 39.2550 +				});
 39.2551 +	},
 39.2552 +	
 39.2553 +	slideDown: function(speed,callback){
 39.2554 +		return this.animate({height: "show"}, speed, callback);
 39.2555 +	},
 39.2556 +	
 39.2557 +	slideUp: function(speed,callback){
 39.2558 +		return this.animate({height: "hide"}, speed, callback);
 39.2559 +	},
 39.2560 +
 39.2561 +	slideToggle: function(speed, callback){
 39.2562 +		return this.animate({height: "toggle"}, speed, callback);
 39.2563 +	},
 39.2564 +	
 39.2565 +	fadeIn: function(speed, callback){
 39.2566 +		return this.animate({opacity: "show"}, speed, callback);
 39.2567 +	},
 39.2568 +	
 39.2569 +	fadeOut: function(speed, callback){
 39.2570 +		return this.animate({opacity: "hide"}, speed, callback);
 39.2571 +	},
 39.2572 +	
 39.2573 +	fadeTo: function(speed,to,callback){
 39.2574 +		return this.animate({opacity: to}, speed, callback);
 39.2575 +	},
 39.2576 +	
 39.2577 +	animate: function( prop, speed, easing, callback ) {
 39.2578 +		var opt = jQuery.speed(speed, easing, callback);
 39.2579 +
 39.2580 +		return this[ opt.queue === false ? "each" : "queue" ](function(){
 39.2581 +			opt = jQuery.extend({}, opt);
 39.2582 +			var hidden = jQuery(this).is(":hidden"), self = this;
 39.2583 +			
 39.2584 +			for ( var p in prop ) {
 39.2585 +				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
 39.2586 +					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
 39.2587 +
 39.2588 +				if ( p == "height" || p == "width" ) {
 39.2589 +					// Store display property
 39.2590 +					opt.display = jQuery.css(this, "display");
 39.2591 +
 39.2592 +					// Make sure that nothing sneaks out
 39.2593 +					opt.overflow = this.style.overflow;
 39.2594 +				}
 39.2595 +			}
 39.2596 +
 39.2597 +			if ( opt.overflow != null )
 39.2598 +				this.style.overflow = "hidden";
 39.2599 +
 39.2600 +			opt.curAnim = jQuery.extend({}, prop);
 39.2601 +			
 39.2602 +			jQuery.each( prop, function(name, val){
 39.2603 +				var e = new jQuery.fx( self, opt, name );
 39.2604 +
 39.2605 +				if ( /toggle|show|hide/.test(val) )
 39.2606 +					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 39.2607 +				else {
 39.2608 +					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
 39.2609 +						start = e.cur(true) || 0;
 39.2610 +
 39.2611 +					if ( parts ) {
 39.2612 +						var end = parseFloat(parts[2]),
 39.2613 +							unit = parts[3] || "px";
 39.2614 +
 39.2615 +						// We need to compute starting value
 39.2616 +						if ( unit != "px" ) {
 39.2617 +							self.style[ name ] = (end || 1) + unit;
 39.2618 +							start = ((end || 1) / e.cur(true)) * start;
 39.2619 +							self.style[ name ] = start + unit;
 39.2620 +						}
 39.2621 +
 39.2622 +						// If a +=/-= token was provided, we're doing a relative animation
 39.2623 +						if ( parts[1] )
 39.2624 +							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
 39.2625 +
 39.2626 +						e.custom( start, end, unit );
 39.2627 +					} else
 39.2628 +						e.custom( start, val, "" );
 39.2629 +				}
 39.2630 +			});
 39.2631 +
 39.2632 +			// For JS strict compliance
 39.2633 +			return true;
 39.2634 +		});
 39.2635 +	},
 39.2636 +	
 39.2637 +	queue: function(type, fn){
 39.2638 +		if ( jQuery.isFunction(type) ) {
 39.2639 +			fn = type;
 39.2640 +			type = "fx";
 39.2641 +		}
 39.2642 +
 39.2643 +		if ( !type || (typeof type == "string" && !fn) )
 39.2644 +			return queue( this[0], type );
 39.2645 +
 39.2646 +		return this.each(function(){
 39.2647 +			if ( fn.constructor == Array )
 39.2648 +				queue(this, type, fn);
 39.2649 +			else {
 39.2650 +				queue(this, type).push( fn );
 39.2651 +			
 39.2652 +				if ( queue(this, type).length == 1 )
 39.2653 +					fn.apply(this);
 39.2654 +			}
 39.2655 +		});
 39.2656 +	},
 39.2657 +
 39.2658 +	stop: function(){
 39.2659 +		var timers = jQuery.timers;
 39.2660 +
 39.2661 +		return this.each(function(){
 39.2662 +			for ( var i = 0; i < timers.length; i++ )
 39.2663 +				if ( timers[i].elem == this )
 39.2664 +					timers.splice(i--, 1);
 39.2665 +		}).dequeue();
 39.2666 +	}
 39.2667 +
 39.2668 +});
 39.2669 +
 39.2670 +var queue = function( elem, type, array ) {
 39.2671 +	if ( !elem )
 39.2672 +		return;
 39.2673 +
 39.2674 +	var q = jQuery.data( elem, type + "queue" );
 39.2675 +
 39.2676 +	if ( !q || array )
 39.2677 +		q = jQuery.data( elem, type + "queue", 
 39.2678 +			array ? jQuery.makeArray(array) : [] );
 39.2679 +
 39.2680 +	return q;
 39.2681 +};
 39.2682 +
 39.2683 +jQuery.fn.dequeue = function(type){
 39.2684 +	type = type || "fx";
 39.2685 +
 39.2686 +	return this.each(function(){
 39.2687 +		var q = queue(this, type);
 39.2688 +
 39.2689 +		q.shift();
 39.2690 +
 39.2691 +		if ( q.length )
 39.2692 +			q[0].apply( this );
 39.2693 +	});
 39.2694 +};
 39.2695 +
 39.2696 +jQuery.extend({
 39.2697 +	
 39.2698 +	speed: function(speed, easing, fn) {
 39.2699 +		var opt = speed && speed.constructor == Object ? speed : {
 39.2700 +			complete: fn || !fn && easing || 
 39.2701 +				jQuery.isFunction( speed ) && speed,
 39.2702 +			duration: speed,
 39.2703 +			easing: fn && easing || easing && easing.constructor != Function && easing
 39.2704 +		};
 39.2705 +
 39.2706 +		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
 39.2707 +			opt.duration : 
 39.2708 +			{ slow: 600, fast: 200 }[opt.duration]) || 400;
 39.2709 +	
 39.2710 +		// Queueing
 39.2711 +		opt.old = opt.complete;
 39.2712 +		opt.complete = function(){
 39.2713 +			jQuery(this).dequeue();
 39.2714 +			if ( jQuery.isFunction( opt.old ) )
 39.2715 +				opt.old.apply( this );
 39.2716 +		};
 39.2717 +	
 39.2718 +		return opt;
 39.2719 +	},
 39.2720 +	
 39.2721 +	easing: {
 39.2722 +		linear: function( p, n, firstNum, diff ) {
 39.2723 +			return firstNum + diff * p;
 39.2724 +		},
 39.2725 +		swing: function( p, n, firstNum, diff ) {
 39.2726 +			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 39.2727 +		}
 39.2728 +	},
 39.2729 +	
 39.2730 +	timers: [],
 39.2731 +
 39.2732 +	fx: function( elem, options, prop ){
 39.2733 +		this.options = options;
 39.2734 +		this.elem = elem;
 39.2735 +		this.prop = prop;
 39.2736 +
 39.2737 +		if ( !options.orig )
 39.2738 +			options.orig = {};
 39.2739 +	}
 39.2740 +
 39.2741 +});
 39.2742 +
 39.2743 +jQuery.fx.prototype = {
 39.2744 +
 39.2745 +	// Simple function for setting a style value
 39.2746 +	update: function(){
 39.2747 +		if ( this.options.step )
 39.2748 +			this.options.step.apply( this.elem, [ this.now, this ] );
 39.2749 +
 39.2750 +		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 39.2751 +
 39.2752 +		// Set display property to block for height/width animations
 39.2753 +		if ( this.prop == "height" || this.prop == "width" )
 39.2754 +			this.elem.style.display = "block";
 39.2755 +	},
 39.2756 +
 39.2757 +	// Get the current size
 39.2758 +	cur: function(force){
 39.2759 +		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
 39.2760 +			return this.elem[ this.prop ];
 39.2761 +
 39.2762 +		var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
 39.2763 +		return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
 39.2764 +	},
 39.2765 +
 39.2766 +	// Start an animation from one number to another
 39.2767 +	custom: function(from, to, unit){
 39.2768 +		this.startTime = (new Date()).getTime();
 39.2769 +		this.start = from;
 39.2770 +		this.end = to;
 39.2771 +		this.unit = unit || this.unit || "px";
 39.2772 +		this.now = this.start;
 39.2773 +		this.pos = this.state = 0;
 39.2774 +		this.update();
 39.2775 +
 39.2776 +		var self = this;
 39.2777 +		function t(){
 39.2778 +			return self.step();
 39.2779 +		}
 39.2780 +
 39.2781 +		t.elem = this.elem;
 39.2782 +
 39.2783 +		jQuery.timers.push(t);
 39.2784 +
 39.2785 +		if ( jQuery.timers.length == 1 ) {
 39.2786 +			var timer = setInterval(function(){
 39.2787 +				var timers = jQuery.timers;
 39.2788 +				
 39.2789 +				for ( var i = 0; i < timers.length; i++ )
 39.2790 +					if ( !timers[i]() )
 39.2791 +						timers.splice(i--, 1);
 39.2792 +
 39.2793 +				if ( !timers.length )
 39.2794 +					clearInterval( timer );
 39.2795 +			}, 13);
 39.2796 +		}
 39.2797 +	},
 39.2798 +
 39.2799 +	// Simple 'show' function
 39.2800 +	show: function(){
 39.2801 +		// Remember where we started, so that we can go back to it later
 39.2802 +		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 39.2803 +		this.options.show = true;
 39.2804 +
 39.2805 +		// Begin the animation
 39.2806 +		this.custom(0, this.cur());
 39.2807 +
 39.2808 +		// Make sure that we start at a small width/height to avoid any
 39.2809 +		// flash of content
 39.2810 +		if ( this.prop == "width" || this.prop == "height" )
 39.2811 +			this.elem.style[this.prop] = "1px";
 39.2812 +		
 39.2813 +		// Start by showing the element
 39.2814 +		jQuery(this.elem).show();
 39.2815 +	},
 39.2816 +
 39.2817 +	// Simple 'hide' function
 39.2818 +	hide: function(){
 39.2819 +		// Remember where we started, so that we can go back to it later
 39.2820 +		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 39.2821 +		this.options.hide = true;
 39.2822 +
 39.2823 +		// Begin the animation
 39.2824 +		this.custom(this.cur(), 0);
 39.2825 +	},
 39.2826 +
 39.2827 +	// Each step of an animation
 39.2828 +	step: function(){
 39.2829 +		var t = (new Date()).getTime();
 39.2830 +
 39.2831 +		if ( t > this.options.duration + this.startTime ) {
 39.2832 +			this.now = this.end;
 39.2833 +			this.pos = this.state = 1;
 39.2834 +			this.update();
 39.2835 +
 39.2836 +			this.options.curAnim[ this.prop ] = true;
 39.2837 +
 39.2838 +			var done = true;
 39.2839 +			for ( var i in this.options.curAnim )
 39.2840 +				if ( this.options.curAnim[i] !== true )
 39.2841 +					done = false;
 39.2842 +
 39.2843 +			if ( done ) {
 39.2844 +				if ( this.options.display != null ) {
 39.2845 +					// Reset the overflow
 39.2846 +					this.elem.style.overflow = this.options.overflow;
 39.2847 +				
 39.2848 +					// Reset the display
 39.2849 +					this.elem.style.display = this.options.display;
 39.2850 +					if ( jQuery.css(this.elem, "display") == "none" )
 39.2851 +						this.elem.style.display = "block";
 39.2852 +				}
 39.2853 +
 39.2854 +				// Hide the element if the "hide" operation was done
 39.2855 +				if ( this.options.hide )
 39.2856 +					this.elem.style.display = "none";
 39.2857 +
 39.2858 +				// Reset the properties, if the item has been hidden or shown
 39.2859 +				if ( this.options.hide || this.options.show )
 39.2860 +					for ( var p in this.options.curAnim )
 39.2861 +						jQuery.attr(this.elem.style, p, this.options.orig[p]);
 39.2862 +			}
 39.2863 +
 39.2864 +			// If a callback was provided, execute it
 39.2865 +			if ( done && jQuery.isFunction( this.options.complete ) )
 39.2866 +				// Execute the complete function
 39.2867 +				this.options.complete.apply( this.elem );
 39.2868 +
 39.2869 +			return false;
 39.2870 +		} else {
 39.2871 +			var n = t - this.startTime;
 39.2872 +			this.state = n / this.options.duration;
 39.2873 +
 39.2874 +			// Perform the easing function, defaults to swing
 39.2875 +			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
 39.2876 +			this.now = this.start + ((this.end - this.start) * this.pos);
 39.2877 +
 39.2878 +			// Perform the next step of the animation
 39.2879 +			this.update();
 39.2880 +		}
 39.2881 +
 39.2882 +		return true;
 39.2883 +	}
 39.2884 +
 39.2885 +};
 39.2886 +
 39.2887 +jQuery.fx.step = {
 39.2888 +	scrollLeft: function(fx){
 39.2889 +		fx.elem.scrollLeft = fx.now;
 39.2890 +	},
 39.2891 +
 39.2892 +	scrollTop: function(fx){
 39.2893 +		fx.elem.scrollTop = fx.now;
 39.2894 +	},
 39.2895 +
 39.2896 +	opacity: function(fx){
 39.2897 +		jQuery.attr(fx.elem.style, "opacity", fx.now);
 39.2898 +	},
 39.2899 +
 39.2900 +	_default: function(fx){
 39.2901 +		fx.elem.style[ fx.prop ] = fx.now + fx.unit;
 39.2902 +	}
 39.2903 +};
 39.2904 +// The Offset Method
 39.2905 +// Originally By Brandon Aaron, part of the Dimension Plugin
 39.2906 +// http://jquery.com/plugins/project/dimensions
 39.2907 +jQuery.fn.offset = function() {
 39.2908 +	var left = 0, top = 0, elem = this[0], results;
 39.2909 +	
 39.2910 +	if ( elem ) with ( jQuery.browser ) {
 39.2911 +		var	absolute     = jQuery.css(elem, "position") == "absolute", 
 39.2912 +		    parent       = elem.parentNode, 
 39.2913 +		    offsetParent = elem.offsetParent, 
 39.2914 +		    doc          = elem.ownerDocument,
 39.2915 +		    safari2      = safari && parseInt(version) < 522;
 39.2916 +	
 39.2917 +		// Use getBoundingClientRect if available
 39.2918 +		if ( elem.getBoundingClientRect ) {
 39.2919 +			box = elem.getBoundingClientRect();
 39.2920 +		
 39.2921 +			// Add the document scroll offsets
 39.2922 +			add(
 39.2923 +				box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 39.2924 +				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop)
 39.2925 +			);
 39.2926 +		
 39.2927 +			// IE adds the HTML element's border, by default it is medium which is 2px
 39.2928 +			// IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; }
 39.2929 +			// IE 7 standards mode, the border is always 2px
 39.2930 +			if ( msie ) {
 39.2931 +				var border = jQuery("html").css("borderWidth");
 39.2932 +				border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
 39.2933 +				add( -border, -border );
 39.2934 +			}
 39.2935 +	
 39.2936 +		// Otherwise loop through the offsetParents and parentNodes
 39.2937 +		} else {
 39.2938 +		
 39.2939 +			// Initial element offsets
 39.2940 +			add( elem.offsetLeft, elem.offsetTop );
 39.2941 +		
 39.2942 +			// Get parent offsets
 39.2943 +			while ( offsetParent ) {
 39.2944 +				// Add offsetParent offsets
 39.2945 +				add( offsetParent.offsetLeft, offsetParent.offsetTop );
 39.2946 +			
 39.2947 +				// Mozilla and Safari > 2 does not include the border on offset parents
 39.2948 +				// However Mozilla adds the border for table cells
 39.2949 +				if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
 39.2950 +					border( offsetParent );
 39.2951 +				
 39.2952 +				// Safari <= 2 doubles body offsets with an absolutely positioned element or parent
 39.2953 +				if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
 39.2954 +					absolute = true;
 39.2955 +			
 39.2956 +				// Get next offsetParent
 39.2957 +				offsetParent = offsetParent.offsetParent;
 39.2958 +			}
 39.2959 +		
 39.2960 +			// Get parent scroll offsets
 39.2961 +			while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
 39.2962 +				// Work around opera inline/table scrollLeft/Top bug
 39.2963 +				if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
 39.2964 +					// Subtract parent scroll offsets
 39.2965 +					add( -parent.scrollLeft, -parent.scrollTop );
 39.2966 +			
 39.2967 +				// Mozilla does not add the border for a parent that has overflow != visible
 39.2968 +				if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
 39.2969 +					border( parent );
 39.2970 +			
 39.2971 +				// Get next parent
 39.2972 +				parent = parent.parentNode;
 39.2973 +			}
 39.2974 +		
 39.2975 +			// Safari doubles body offsets with an absolutely positioned element or parent
 39.2976 +			if ( safari2 && absolute )
 39.2977 +				add( -doc.body.offsetLeft, -doc.body.offsetTop );
 39.2978 +		}
 39.2979 +
 39.2980 +		// Return an object with top and left properties
 39.2981 +		results = { top: top, left: left };
 39.2982 +	}
 39.2983 +
 39.2984 +	return results;
 39.2985 +
 39.2986 +	function border(elem) {
 39.2987 +		add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
 39.2988 +	}
 39.2989 +
 39.2990 +	function add(l, t) {
 39.2991 +		left += parseInt(l) || 0;
 39.2992 +		top += parseInt(t) || 0;
 39.2993 +	}
 39.2994 +};
 39.2995 +})();
    40.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    40.2 +++ b/web/support/styles/styles.css	Tue Oct 27 21:31:06 2009 -0700
    40.3 @@ -0,0 +1,293 @@
    40.4 +body {
    40.5 +  background: #F2F1F0;
    40.6 +  font-family: verdana,sans-serif;
    40.7 +}
    40.8 +
    40.9 +.navheader, .book, .preface, .chapter, .appendix, .bibliography, .navfooter, .basetemplate {
   40.10 +  width: 50em;
   40.11 +  margin-left: auto;
   40.12 +  margin-right: auto;
   40.13 +}
   40.14 +
   40.15 +a.commenttoggle:hover, a.commenttoggle:active {
   40.16 +  opacity: 0.7;
   40.17 +}
   40.18 +
   40.19 +.book, .preface, .chapter, .appendix, .bibliography, .basetemplate {
   40.20 +  background: white;
   40.21 +  padding: 2em;
   40.22 +}
   40.23 +
   40.24 +h1 {
   40.25 +  margin-top: 1.5em;
   40.26 +}
   40.27 +
   40.28 +span.beta {
   40.29 +  font-size: 80%;
   40.30 +  font-style: italic;
   40.31 +  opacity: 0.4;
   40.32 +}
   40.33 +
   40.34 +h2, h3 {
   40.35 +  margin-top: 2em;
   40.36 +}
   40.37 +
   40.38 +h1, h2, h3 {
   40.39 +  font-family: georgia,serif;
   40.40 +  font-weight: normal;
   40.41 +  margin-bottom: 0.5em;
   40.42 +}
   40.43 +
   40.44 +h1.booktitle {
   40.45 +  margin-bottom: 0px;
   40.46 +}
   40.47 +
   40.48 +h2.booktitle {
   40.49 +  text-align: center;
   40.50 +}
   40.51 +
   40.52 +h2.booktitle > a {
   40.53 +  color: black;
   40.54 +}
   40.55 +
   40.56 +.authors {
   40.57 +  font-size: 80%;
   40.58 +  opacity: 0.55;
   40.59 +  padding-left: 0.5em;
   40.60 +}
   40.61 +
   40.62 +div.note th, div.tip th, div.warning th {
   40.63 +  font-family: georgia,serif;
   40.64 +  font-weight: normal;
   40.65 +  font-size: 110%;
   40.66 +}
   40.67 +
   40.68 +div.navheader th, div.navfooter td {
   40.69 +  font-family: georgia,serif;
   40.70 +}
   40.71 +
   40.72 +div.navheader th {
   40.73 +  opacity: 0;
   40.74 +  font-size: 0;
   40.75 +}
   40.76 +
   40.77 +pre.screen {
   40.78 +  background-image: url(/support/icons/shell.png);
   40.79 +}
   40.80 +
   40.81 +pre.programlisting {
   40.82 +  background-image: url(/support/icons/source.png);
   40.83 +}
   40.84 +
   40.85 +pre.programlisting, pre.screen, p.remark {
   40.86 +  border-style: solid;
   40.87 +  border-width: 1px;
   40.88 +  font-size: medium;
   40.89 +  padding: 1em;
   40.90 +  background-repeat: no-repeat;
   40.91 +  background-position: 10px 10px;
   40.92 +  padding-left: 70px;
   40.93 +}
   40.94 +
   40.95 +strong.command, code, pre, span.type {
   40.96 +  font-family: monospace;
   40.97 +  font-weight: normal;
   40.98 +}
   40.99 +
  40.100 +strong.userinput > code {
  40.101 +  font-weight: bolder;
  40.102 +  color: #303030;
  40.103 +}
  40.104 +
  40.105 +div.toc > p {
  40.106 +  opacity: 0.35;
  40.107 +  font-family: georgia,serif;
  40.108 +  cursor: pointer;
  40.109 +}
  40.110 +
  40.111 +div.toc b {
  40.112 +  font-weight: normal;
  40.113 +  font-size: large;
  40.114 +}
  40.115 +
  40.116 +ul.booktoc {
  40.117 +  padding-left: 0px;
  40.118 +  list-style-type: none;
  40.119 +}
  40.120 +
  40.121 +.booktoc > li {
  40.122 +  padding: 0.5em;
  40.123 +}
  40.124 +
  40.125 +.chapinfo {
  40.126 +  float: right;
  40.127 +  color: #a0a0a0;
  40.128 +}
  40.129 +
  40.130 +.unpublished {
  40.131 +  color: #a0a0a0;
  40.132 +}
  40.133 +
  40.134 +.chapinfo img {
  40.135 +  vertical-align: -35%;
  40.136 +  border: 0px;
  40.137 +}
  40.138 +
  40.139 +.zebra_b {
  40.140 +  background: #f4f4f4;
  40.141 +}
  40.142 +
  40.143 +.book .titlepage {
  40.144 +  display: none;
  40.145 +}
  40.146 +
  40.147 +.chapter div.toc > dl {
  40.148 +  display: none;
  40.149 +}
  40.150 +
  40.151 +pre.programlisting, pre.screen, p.remark {
  40.152 +  overflow: hidden;
  40.153 +}
  40.154 +
  40.155 +p.remark {
  40.156 +  background-image: url(/support/icons/remark.png);
  40.157 +}
  40.158 +
  40.159 +div.warning, p.remark {
  40.160 +  background-color: #FFEFE8;
  40.161 +  border-color: #e0a8a0;
  40.162 +}
  40.163 +
  40.164 +span.remark {
  40.165 +  font-style: normal;
  40.166 +  color: #707070;
  40.167 +}
  40.168 +
  40.169 +.screen {
  40.170 +  background: #e7ffc7 none repeat scroll 0% 50%;
  40.171 +  border-color: #94DA3A;
  40.172 +}
  40.173 +
  40.174 +.programlisting {
  40.175 +  background: #F0F4FF none repeat scroll 0% 50%;
  40.176 +  border-color: #B4BAEA;
  40.177 +}
  40.178 +
  40.179 +.prompt {
  40.180 +  color: #448844;
  40.181 +}
  40.182 +
  40.183 +div.note, div.tip {
  40.184 +  background: #ffffc9;
  40.185 +  border-color: #B4BAEA;
  40.186 +}
  40.187 +
  40.188 +div.note, div.warning, div.tip {
  40.189 +  border-style: solid;
  40.190 +  border-width: 1px;
  40.191 +  padding: 1em;
  40.192 +}
  40.193 +
  40.194 +.note .title {
  40.195 +  font-size: 90%;
  40.196 +}
  40.197 +
  40.198 +.comment {
  40.199 +  font-size: 80%;
  40.200 +}
  40.201 +
  40.202 +div.comment, div.new_comment {
  40.203 +  padding: 0.5em;
  40.204 +  margin: 0.5em;
  40.205 +  margin-left: 2em;
  40.206 +  border-style: solid;
  40.207 +  border-width: 1px;
  40.208 +  border-color: #aaaaff;
  40.209 +}
  40.210 +
  40.211 +div.comment {
  40.212 +  background: #eeeeff;
  40.213 +}
  40.214 +
  40.215 +div.new_comment {
  40.216 +  background: #d0d0ff;
  40.217 +}
  40.218 +
  40.219 +.commenttoggle {
  40.220 +  opacity: 0.35;
  40.221 +}
  40.222 +
  40.223 +.comment_help {
  40.224 +  font-size: 80%;
  40.225 +}
  40.226 +
  40.227 +.comment_header {
  40.228 +  opacity: 0.75;
  40.229 +}
  40.230 +
  40.231 +.comment_id {
  40.232 +  float: right;
  40.233 +  opacity: 0.3;
  40.234 +  font-size: 60%;
  40.235 +}
  40.236 +
  40.237 +.comment_name {
  40.238 +  font-weight: bolder;
  40.239 +}
  40.240 +
  40.241 +.comment_reviewed {
  40.242 +  color: darkgreen;
  40.243 +  margin-left: 1em;
  40.244 +  font-style: italic;
  40.245 +}
  40.246 +
  40.247 +.comment_date {
  40.248 +  opacity: 0.75;
  40.249 +}
  40.250 +
  40.251 +.comment_thanks {
  40.252 +  color: darkblue;
  40.253 +  margin-left: 1em;
  40.254 +  font-style: italic;
  40.255 +  font-weight: bolder;
  40.256 +}
  40.257 +
  40.258 +.comment_error {
  40.259 +  padding-left: 1em;
  40.260 +  font-weight: bolder;
  40.261 +  font-size: 80%;
  40.262 +  color: darkred;
  40.263 +}
  40.264 +
  40.265 +.hgbookfooter {
  40.266 +  width: 60em;
  40.267 +  margin-left: auto;
  40.268 +  margin-right: auto;
  40.269 +  margin-top: 2em;
  40.270 +  padding: 2em;
  40.271 +  margin-bottom: 2em;
  40.272 +  font-size: 80%;
  40.273 +  color: #727272;
  40.274 +  border-top: 1px solid grey;
  40.275 +}
  40.276 +
  40.277 +.hgbookfooter a {
  40.278 +  color: #5555ff;
  40.279 +}
  40.280 +
  40.281 +.hgbookfooter a:visited {
  40.282 +  opacity: 0.7;
  40.283 +}
  40.284 +
  40.285 +.hgbookfooter img {
  40.286 +  vertical-align: -45%;
  40.287 +}
  40.288 +
  40.289 +table.equation a.commenttoggle {
  40.290 +  text-align: right;
  40.291 +  display: block;
  40.292 +}
  40.293 +
  40.294 +div.comment, div.new_comment, form.comment {
  40.295 +  text-align: left;
  40.296 +}