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') > -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&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&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&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&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 +}