hgbook

changeset 900:5e63e72aed10

Restructure the folders layout to allow easier static serving with a real webserver in the future.
author dukebody <dukebody@gmail.com>
date Mon Oct 26 14:46:22 2009 +0100 (2009-10-26)
parents 53a382ea07aa
children 9768fafa5977
files web/hgbook/urls.py 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/styles.css web/support/icons/caution.png web/support/icons/favicon.png web/support/icons/important.png web/support/icons/note.png web/support/icons/remark.png web/support/icons/rss.png web/support/icons/shell.png web/support/icons/source.png web/support/icons/tip.png web/support/icons/warning.png web/support/javascript/form-min.js web/support/javascript/form.js web/support/javascript/jquery-min.js web/support/javascript/jquery.js web/support/styles/styles.css
line diff
     1.1 --- a/web/hgbook/urls.py	Mon Oct 26 14:12:27 2009 +0100
     1.2 +++ b/web/hgbook/urls.py	Mon Oct 26 14:46:22 2009 +0100
     1.3 @@ -21,10 +21,7 @@
     1.4          sys.modules[__name__].__file__) + '/../html')}),
     1.5       (r'^support/(?P<path>.*)$', 'django.views.static.serve',
     1.6       {'document_root': os.path.realpath(os.path.dirname(
     1.7 -        sys.modules[__name__].__file__) + '/../javascript')}),
     1.8 -     (r'^styles/(?P<path>.*)$', 'django.views.static.serve',
     1.9 -     {'document_root': os.path.realpath(os.path.dirname(
    1.10 -        sys.modules[__name__].__file__) + '/../styles')}),
    1.11 +        sys.modules[__name__].__file__) + '/../support')}),
    1.12  
    1.13      # Uncomment this for admin:
    1.14      (r'^admin/(.*)', admin.site.root),
     2.1 Binary file web/icons/caution.png has changed
     3.1 Binary file web/icons/favicon.png has changed
     4.1 Binary file web/icons/important.png has changed
     5.1 Binary file web/icons/note.png has changed
     6.1 Binary file web/icons/remark.png has changed
     7.1 Binary file web/icons/rss.png has changed
     8.1 Binary file web/icons/shell.png has changed
     9.1 Binary file web/icons/source.png has changed
    10.1 Binary file web/icons/tip.png has changed
    11.1 Binary file web/icons/warning.png has changed
    12.1 --- a/web/javascript/form-min.js	Mon Oct 26 14:12:27 2009 +0100
    12.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    12.3 @@ -1,1 +0,0 @@
    12.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);
    12.5 \ No newline at end of file
    13.1 --- a/web/javascript/form.js	Mon Oct 26 14:12:27 2009 +0100
    13.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.3 @@ -1,819 +0,0 @@
    13.4 -/*
    13.5 - * jQuery Form Plugin
    13.6 - * @requires jQuery v1.1 or later
    13.7 - *
    13.8 - * Examples at: http://malsup.com/jquery/form/
    13.9 - * Dual licensed under the MIT and GPL licenses:
   13.10 - *   http://www.opensource.org/licenses/mit-license.php
   13.11 - *   http://www.gnu.org/licenses/gpl.html
   13.12 - *
   13.13 - * Revision: $Id$
   13.14 - */
   13.15 - (function($) {
   13.16 -/**
   13.17 - * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
   13.18 - *
   13.19 - * ajaxSubmit accepts a single argument which can be either a success callback function
   13.20 - * or an options Object.  If a function is provided it will be invoked upon successful
   13.21 - * completion of the submit and will be passed the response from the server.
   13.22 - * If an options Object is provided, the following attributes are supported:
   13.23 - *
   13.24 - *  target:   Identifies the element(s) in the page to be updated with the server response.
   13.25 - *            This value may be specified as a jQuery selection string, a jQuery object,
   13.26 - *            or a DOM element.
   13.27 - *            default value: null
   13.28 - *
   13.29 - *  url:      URL to which the form data will be submitted.
   13.30 - *            default value: value of form's 'action' attribute
   13.31 - *
   13.32 - *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
   13.33 - *            default value: value of form's 'method' attribute (or 'GET' if none found)
   13.34 - *
   13.35 - *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
   13.36 - *
   13.37 - *  beforeSubmit:  Callback method to be invoked before the form is submitted.
   13.38 - *            default value: null
   13.39 - *
   13.40 - *  success:  Callback method to be invoked after the form has been successfully submitted
   13.41 - *            and the response has been returned from the server
   13.42 - *            default value: null
   13.43 - *
   13.44 - *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
   13.45 - *            default value: null
   13.46 - *
   13.47 - *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
   13.48 - *            default value: false
   13.49 - *
   13.50 - *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
   13.51 - *
   13.52 - *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
   13.53 - *
   13.54 - *
   13.55 - * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
   13.56 - * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
   13.57 - * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
   13.58 - * in array format, the jQuery object, and the options object passed into ajaxSubmit.
   13.59 - * The form data array takes the following form:
   13.60 - *
   13.61 - *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
   13.62 - *
   13.63 - * If a 'success' callback method is provided it is invoked after the response has been returned
   13.64 - * from the server.  It is passed the responseText or responseXML value (depending on dataType).
   13.65 - * See jQuery.ajax for further details.
   13.66 - *
   13.67 - *
   13.68 - * The dataType option provides a means for specifying how the server response should be handled.
   13.69 - * This maps directly to the jQuery.httpData method.  The following values are supported:
   13.70 - *
   13.71 - *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
   13.72 - *                   callback method, if specified, will be passed the responseXML value
   13.73 - *      'json':   if dataType == 'json' the server response will be evaluted and passed to
   13.74 - *                   the 'success' callback, if specified
   13.75 - *      'script': if dataType == 'script' the server response is evaluated in the global context
   13.76 - *
   13.77 - *
   13.78 - * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
   13.79 - * are provided the target will be ignored.
   13.80 - *
   13.81 - * The semantic argument can be used to force form serialization in semantic order.
   13.82 - * This is normally true anyway, unless the form contains input elements of type='image'.
   13.83 - * If your form must be submitted with name/value pairs in semantic order and your form
   13.84 - * contains an input of type='image" then pass true for this arg, otherwise pass false
   13.85 - * (or nothing) to avoid the overhead for this logic.
   13.86 - *
   13.87 - *
   13.88 - * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
   13.89 - *
   13.90 - * $("#form-id").submit(function() {
   13.91 - *     $(this).ajaxSubmit(options);
   13.92 - *     return false; // cancel conventional submit
   13.93 - * });
   13.94 - *
   13.95 - * When using ajaxForm(), however, this is done for you.
   13.96 - *
   13.97 - * @example
   13.98 - * $('#myForm').ajaxSubmit(function(data) {
   13.99 - *     alert('Form submit succeeded! Server returned: ' + data);
  13.100 - * });
  13.101 - * @desc Submit form and alert server response
  13.102 - *
  13.103 - *
  13.104 - * @example
  13.105 - * var options = {
  13.106 - *     target: '#myTargetDiv'
  13.107 - * };
  13.108 - * $('#myForm').ajaxSubmit(options);
  13.109 - * @desc Submit form and update page element with server response
  13.110 - *
  13.111 - *
  13.112 - * @example
  13.113 - * var options = {
  13.114 - *     success: function(responseText) {
  13.115 - *         alert(responseText);
  13.116 - *     }
  13.117 - * };
  13.118 - * $('#myForm').ajaxSubmit(options);
  13.119 - * @desc Submit form and alert the server response
  13.120 - *
  13.121 - *
  13.122 - * @example
  13.123 - * var options = {
  13.124 - *     beforeSubmit: function(formArray, jqForm) {
  13.125 - *         if (formArray.length == 0) {
  13.126 - *             alert('Please enter data.');
  13.127 - *             return false;
  13.128 - *         }
  13.129 - *     }
  13.130 - * };
  13.131 - * $('#myForm').ajaxSubmit(options);
  13.132 - * @desc Pre-submit validation which aborts the submit operation if form data is empty
  13.133 - *
  13.134 - *
  13.135 - * @example
  13.136 - * var options = {
  13.137 - *     url: myJsonUrl.php,
  13.138 - *     dataType: 'json',
  13.139 - *     success: function(data) {
  13.140 - *        // 'data' is an object representing the the evaluated json data
  13.141 - *     }
  13.142 - * };
  13.143 - * $('#myForm').ajaxSubmit(options);
  13.144 - * @desc json data returned and evaluated
  13.145 - *
  13.146 - *
  13.147 - * @example
  13.148 - * var options = {
  13.149 - *     url: myXmlUrl.php,
  13.150 - *     dataType: 'xml',
  13.151 - *     success: function(responseXML) {
  13.152 - *        // responseXML is XML document object
  13.153 - *        var data = $('myElement', responseXML).text();
  13.154 - *     }
  13.155 - * };
  13.156 - * $('#myForm').ajaxSubmit(options);
  13.157 - * @desc XML data returned from server
  13.158 - *
  13.159 - *
  13.160 - * @example
  13.161 - * var options = {
  13.162 - *     resetForm: true
  13.163 - * };
  13.164 - * $('#myForm').ajaxSubmit(options);
  13.165 - * @desc submit form and reset it if successful
  13.166 - *
  13.167 - * @example
  13.168 - * $('#myForm).submit(function() {
  13.169 - *    $(this).ajaxSubmit();
  13.170 - *    return false;
  13.171 - * });
  13.172 - * @desc Bind form's submit event to use ajaxSubmit
  13.173 - *
  13.174 - *
  13.175 - * @name ajaxSubmit
  13.176 - * @type jQuery
  13.177 - * @param options  object literal containing options which control the form submission process
  13.178 - * @cat Plugins/Form
  13.179 - * @return jQuery
  13.180 - */
  13.181 -$.fn.ajaxSubmit = function(options) {
  13.182 -    if (typeof options == 'function')
  13.183 -        options = { success: options };
  13.184 -
  13.185 -    options = $.extend({
  13.186 -        url:  this.attr('action') || window.location,
  13.187 -        type: this.attr('method') || 'GET'
  13.188 -    }, options || {});
  13.189 -
  13.190 -    // hook for manipulating the form data before it is extracted;
  13.191 -    // convenient for use with rich editors like tinyMCE or FCKEditor
  13.192 -    var veto = {};
  13.193 -    $.event.trigger('form.pre.serialize', [this, options, veto]);
  13.194 -    if (veto.veto) return this;
  13.195 -
  13.196 -    var a = this.formToArray(options.semantic);
  13.197 -	if (options.data) {
  13.198 -	    for (var n in options.data)
  13.199 -	        a.push( { name: n, value: options.data[n] } );
  13.200 -	}
  13.201 -
  13.202 -    // give pre-submit callback an opportunity to abort the submit
  13.203 -    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
  13.204 -
  13.205 -    // fire vetoable 'validate' event
  13.206 -    $.event.trigger('form.submit.validate', [a, this, options, veto]);
  13.207 -    if (veto.veto) return this;
  13.208 -
  13.209 -    var q = $.param(a);//.replace(/%20/g,'+');
  13.210 -
  13.211 -    if (options.type.toUpperCase() == 'GET') {
  13.212 -        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
  13.213 -        options.data = null;  // data is null for 'get'
  13.214 -    }
  13.215 -    else
  13.216 -        options.data = q; // data is the query string for 'post'
  13.217 -
  13.218 -    var $form = this, callbacks = [];
  13.219 -    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
  13.220 -    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
  13.221 -
  13.222 -    // perform a load on the target only if dataType is not provided
  13.223 -    if (!options.dataType && options.target) {
  13.224 -        var oldSuccess = options.success || function(){};
  13.225 -        callbacks.push(function(data) {
  13.226 -            if (this.evalScripts)
  13.227 -                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
  13.228 -            else // jQuery v1.1.4
  13.229 -                $(options.target).html(data).each(oldSuccess, arguments);
  13.230 -        });
  13.231 -    }
  13.232 -    else if (options.success)
  13.233 -        callbacks.push(options.success);
  13.234 -
  13.235 -    options.success = function(data, status) {
  13.236 -        for (var i=0, max=callbacks.length; i < max; i++)
  13.237 -            callbacks[i](data, status, $form);
  13.238 -    };
  13.239 -
  13.240 -    // are there files to upload?
  13.241 -    var files = $('input:file', this).fieldValue();
  13.242 -    var found = false;
  13.243 -    for (var j=0; j < files.length; j++)
  13.244 -        if (files[j])
  13.245 -            found = true;
  13.246 -
  13.247 -    if (options.iframe || found) // options.iframe allows user to force iframe mode
  13.248 -        fileUpload();
  13.249 -    else
  13.250 -        $.ajax(options);
  13.251 -
  13.252 -    // fire 'notify' event
  13.253 -    $.event.trigger('form.submit.notify', [this, options]);
  13.254 -    return this;
  13.255 -
  13.256 -
  13.257 -    // private function for handling file uploads (hat tip to YAHOO!)
  13.258 -    function fileUpload() {
  13.259 -        var form = $form[0];
  13.260 -        var opts = $.extend({}, $.ajaxSettings, options);
  13.261 -
  13.262 -        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
  13.263 -        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
  13.264 -        var io = $io[0];
  13.265 -        var op8 = $.browser.opera && window.opera.version() < 9;
  13.266 -        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
  13.267 -        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
  13.268 -
  13.269 -        var xhr = { // mock object
  13.270 -            responseText: null,
  13.271 -            responseXML: null,
  13.272 -            status: 0,
  13.273 -            statusText: 'n/a',
  13.274 -            getAllResponseHeaders: function() {},
  13.275 -            getResponseHeader: function() {},
  13.276 -            setRequestHeader: function() {}
  13.277 -        };
  13.278 -
  13.279 -        var g = opts.global;
  13.280 -        // trigger ajax global events so that activity/block indicators work like normal
  13.281 -        if (g && ! $.active++) $.event.trigger("ajaxStart");
  13.282 -        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
  13.283 -
  13.284 -        var cbInvoked = 0;
  13.285 -        var timedOut = 0;
  13.286 -
  13.287 -        // take a breath so that pending repaints get some cpu time before the upload starts
  13.288 -        setTimeout(function() {
  13.289 -            $io.appendTo('body');
  13.290 -            // jQuery's event binding doesn't work for iframe events in IE
  13.291 -            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
  13.292 -
  13.293 -            // make sure form attrs are set
  13.294 -            var encAttr = form.encoding ? 'encoding' : 'enctype';
  13.295 -            var t = $form.attr('target');
  13.296 -            $form.attr({
  13.297 -                target:   id,
  13.298 -                method:  'POST',
  13.299 -                action:   opts.url
  13.300 -            });
  13.301 -            form[encAttr] = 'multipart/form-data';
  13.302 -
  13.303 -            // support timout
  13.304 -            if (opts.timeout)
  13.305 -                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
  13.306 -
  13.307 -            form.submit();
  13.308 -            $form.attr('target', t); // reset target
  13.309 -        }, 10);
  13.310 -
  13.311 -        function cb() {
  13.312 -            if (cbInvoked++) return;
  13.313 -
  13.314 -            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
  13.315 -
  13.316 -            var ok = true;
  13.317 -            try {
  13.318 -                if (timedOut) throw 'timeout';
  13.319 -                // extract the server response from the iframe
  13.320 -                var data, doc;
  13.321 -                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
  13.322 -                xhr.responseText = doc.body ? doc.body.innerHTML : null;
  13.323 -                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
  13.324 -
  13.325 -                if (opts.dataType == 'json' || opts.dataType == 'script') {
  13.326 -                    var ta = doc.getElementsByTagName('textarea')[0];
  13.327 -                    data = ta ? ta.value : xhr.responseText;
  13.328 -                    if (opts.dataType == 'json')
  13.329 -                        eval("data = " + data);
  13.330 -                    else
  13.331 -                        $.globalEval(data);
  13.332 -                }
  13.333 -                else if (opts.dataType == 'xml') {
  13.334 -                    data = xhr.responseXML;
  13.335 -                    if (!data && xhr.responseText != null)
  13.336 -                        data = toXml(xhr.responseText);
  13.337 -                }
  13.338 -                else {
  13.339 -                    data = xhr.responseText;
  13.340 -                }
  13.341 -            }
  13.342 -            catch(e){
  13.343 -                ok = false;
  13.344 -                $.handleError(opts, xhr, 'error', e);
  13.345 -            }
  13.346 -
  13.347 -            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
  13.348 -            if (ok) {
  13.349 -                opts.success(data, 'success');
  13.350 -                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
  13.351 -            }
  13.352 -            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
  13.353 -            if (g && ! --$.active) $.event.trigger("ajaxStop");
  13.354 -            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
  13.355 -
  13.356 -            // clean up
  13.357 -            setTimeout(function() {
  13.358 -                $io.remove();
  13.359 -                xhr.responseXML = null;
  13.360 -            }, 100);
  13.361 -        };
  13.362 -
  13.363 -        function toXml(s, doc) {
  13.364 -            if (window.ActiveXObject) {
  13.365 -                doc = new ActiveXObject('Microsoft.XMLDOM');
  13.366 -                doc.async = 'false';
  13.367 -                doc.loadXML(s);
  13.368 -            }
  13.369 -            else
  13.370 -                doc = (new DOMParser()).parseFromString(s, 'text/xml');
  13.371 -            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
  13.372 -        };
  13.373 -    };
  13.374 -};
  13.375 -$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
  13.376 -
  13.377 -/**
  13.378 - * ajaxForm() provides a mechanism for fully automating form submission.
  13.379 - *
  13.380 - * The advantages of using this method instead of ajaxSubmit() are:
  13.381 - *
  13.382 - * 1: This method will include coordinates for <input type="image" /> elements (if the element
  13.383 - *    is used to submit the form).
  13.384 - * 2. This method will include the submit element's name/value data (for the element that was
  13.385 - *    used to submit the form).
  13.386 - * 3. This method binds the submit() method to the form for you.
  13.387 - *
  13.388 - * Note that for accurate x/y coordinates of image submit elements in all browsers
  13.389 - * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
  13.390 - *
  13.391 - * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
  13.392 - * passes the options argument along after properly binding events for submit elements and
  13.393 - * the form itself.  See ajaxSubmit for a full description of the options argument.
  13.394 - *
  13.395 - *
  13.396 - * @example
  13.397 - * var options = {
  13.398 - *     target: '#myTargetDiv'
  13.399 - * };
  13.400 - * $('#myForm').ajaxSForm(options);
  13.401 - * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
  13.402 - *       when the form is submitted.
  13.403 - *
  13.404 - *
  13.405 - * @example
  13.406 - * var options = {
  13.407 - *     success: function(responseText) {
  13.408 - *         alert(responseText);
  13.409 - *     }
  13.410 - * };
  13.411 - * $('#myForm').ajaxSubmit(options);
  13.412 - * @desc Bind form's submit event so that server response is alerted after the form is submitted.
  13.413 - *
  13.414 - *
  13.415 - * @example
  13.416 - * var options = {
  13.417 - *     beforeSubmit: function(formArray, jqForm) {
  13.418 - *         if (formArray.length == 0) {
  13.419 - *             alert('Please enter data.');
  13.420 - *             return false;
  13.421 - *         }
  13.422 - *     }
  13.423 - * };
  13.424 - * $('#myForm').ajaxSubmit(options);
  13.425 - * @desc Bind form's submit event so that pre-submit callback is invoked before the form
  13.426 - *       is submitted.
  13.427 - *
  13.428 - *
  13.429 - * @name   ajaxForm
  13.430 - * @param  options  object literal containing options which control the form submission process
  13.431 - * @return jQuery
  13.432 - * @cat    Plugins/Form
  13.433 - * @type   jQuery
  13.434 - */
  13.435 -$.fn.ajaxForm = function(options) {
  13.436 -    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
  13.437 -        // store options in hash
  13.438 -        this.formPluginId = $.fn.ajaxForm.counter++;
  13.439 -        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
  13.440 -        $(":submit,input:image", this).click(clickHandler);
  13.441 -    });
  13.442 -};
  13.443 -
  13.444 -$.fn.ajaxForm.counter = 1;
  13.445 -$.fn.ajaxForm.optionHash = {};
  13.446 -
  13.447 -function clickHandler(e) {
  13.448 -    var $form = this.form;
  13.449 -    $form.clk = this;
  13.450 -    if (this.type == 'image') {
  13.451 -        if (e.offsetX != undefined) {
  13.452 -            $form.clk_x = e.offsetX;
  13.453 -            $form.clk_y = e.offsetY;
  13.454 -        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
  13.455 -            var offset = $(this).offset();
  13.456 -            $form.clk_x = e.pageX - offset.left;
  13.457 -            $form.clk_y = e.pageY - offset.top;
  13.458 -        } else {
  13.459 -            $form.clk_x = e.pageX - this.offsetLeft;
  13.460 -            $form.clk_y = e.pageY - this.offsetTop;
  13.461 -        }
  13.462 -    }
  13.463 -    // clear form vars
  13.464 -    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
  13.465 -};
  13.466 -
  13.467 -function submitHandler() {
  13.468 -    // retrieve options from hash
  13.469 -    var id = this.formPluginId;
  13.470 -    var options = $.fn.ajaxForm.optionHash[id];
  13.471 -    $(this).ajaxSubmit(options);
  13.472 -    return false;
  13.473 -};
  13.474 -
  13.475 -/**
  13.476 - * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
  13.477 - *
  13.478 - * @name   ajaxFormUnbind
  13.479 - * @return jQuery
  13.480 - * @cat    Plugins/Form
  13.481 - * @type   jQuery
  13.482 - */
  13.483 -$.fn.ajaxFormUnbind = function() {
  13.484 -    this.unbind('submit', submitHandler);
  13.485 -    return this.each(function() {
  13.486 -        $(":submit,input:image", this).unbind('click', clickHandler);
  13.487 -    });
  13.488 -
  13.489 -};
  13.490 -
  13.491 -/**
  13.492 - * formToArray() gathers form element data into an array of objects that can
  13.493 - * be passed to any of the following ajax functions: $.get, $.post, or load.
  13.494 - * Each object in the array has both a 'name' and 'value' property.  An example of
  13.495 - * an array for a simple login form might be:
  13.496 - *
  13.497 - * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  13.498 - *
  13.499 - * It is this array that is passed to pre-submit callback functions provided to the
  13.500 - * ajaxSubmit() and ajaxForm() methods.
  13.501 - *
  13.502 - * The semantic argument can be used to force form serialization in semantic order.
  13.503 - * This is normally true anyway, unless the form contains input elements of type='image'.
  13.504 - * If your form must be submitted with name/value pairs in semantic order and your form
  13.505 - * contains an input of type='image" then pass true for this arg, otherwise pass false
  13.506 - * (or nothing) to avoid the overhead for this logic.
  13.507 - *
  13.508 - * @example var data = $("#myForm").formToArray();
  13.509 - * $.post( "myscript.cgi", data );
  13.510 - * @desc Collect all the data from a form and submit it to the server.
  13.511 - *
  13.512 - * @name formToArray
  13.513 - * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  13.514 - * @type Array<Object>
  13.515 - * @cat Plugins/Form
  13.516 - */
  13.517 -$.fn.formToArray = function(semantic) {
  13.518 -    var a = [];
  13.519 -    if (this.length == 0) return a;
  13.520 -
  13.521 -    var form = this[0];
  13.522 -    var els = semantic ? form.getElementsByTagName('*') : form.elements;
  13.523 -    if (!els) return a;
  13.524 -    for(var i=0, max=els.length; i < max; i++) {
  13.525 -        var el = els[i];
  13.526 -        var n = el.name;
  13.527 -        if (!n) continue;
  13.528 -
  13.529 -        if (semantic && form.clk && el.type == "image") {
  13.530 -            // handle image inputs on the fly when semantic == true
  13.531 -            if(!el.disabled && form.clk == el)
  13.532 -                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  13.533 -            continue;
  13.534 -        }
  13.535 -
  13.536 -        var v = $.fieldValue(el, true);
  13.537 -        if (v && v.constructor == Array) {
  13.538 -            for(var j=0, jmax=v.length; j < jmax; j++)
  13.539 -                a.push({name: n, value: v[j]});
  13.540 -        }
  13.541 -        else if (v !== null && typeof v != 'undefined')
  13.542 -            a.push({name: n, value: v});
  13.543 -    }
  13.544 -
  13.545 -    if (!semantic && form.clk) {
  13.546 -        // input type=='image' are not found in elements array! handle them here
  13.547 -        var inputs = form.getElementsByTagName("input");
  13.548 -        for(var i=0, max=inputs.length; i < max; i++) {
  13.549 -            var input = inputs[i];
  13.550 -            var n = input.name;
  13.551 -            if(n && !input.disabled && input.type == "image" && form.clk == input)
  13.552 -                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  13.553 -        }
  13.554 -    }
  13.555 -    return a;
  13.556 -};
  13.557 -
  13.558 -
  13.559 -/**
  13.560 - * Serializes form data into a 'submittable' string. This method will return a string
  13.561 - * in the format: name1=value1&amp;name2=value2
  13.562 - *
  13.563 - * The semantic argument can be used to force form serialization in semantic order.
  13.564 - * If your form must be submitted with name/value pairs in semantic order then pass
  13.565 - * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
  13.566 - * this logic (which can be significant for very large forms).
  13.567 - *
  13.568 - * @example var data = $("#myForm").formSerialize();
  13.569 - * $.ajax('POST', "myscript.cgi", data);
  13.570 - * @desc Collect all the data from a form into a single string
  13.571 - *
  13.572 - * @name formSerialize
  13.573 - * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  13.574 - * @type String
  13.575 - * @cat Plugins/Form
  13.576 - */
  13.577 -$.fn.formSerialize = function(semantic) {
  13.578 -    //hand off to jQuery.param for proper encoding
  13.579 -    return $.param(this.formToArray(semantic));
  13.580 -};
  13.581 -
  13.582 -
  13.583 -/**
  13.584 - * Serializes all field elements in the jQuery object into a query string.
  13.585 - * This method will return a string in the format: name1=value1&amp;name2=value2
  13.586 - *
  13.587 - * The successful argument controls whether or not serialization is limited to
  13.588 - * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  13.589 - * The default value of the successful argument is true.
  13.590 - *
  13.591 - * @example var data = $("input").formSerialize();
  13.592 - * @desc Collect the data from all successful input elements into a query string
  13.593 - *
  13.594 - * @example var data = $(":radio").formSerialize();
  13.595 - * @desc Collect the data from all successful radio input elements into a query string
  13.596 - *
  13.597 - * @example var data = $("#myForm :checkbox").formSerialize();
  13.598 - * @desc Collect the data from all successful checkbox input elements in myForm into a query string
  13.599 - *
  13.600 - * @example var data = $("#myForm :checkbox").formSerialize(false);
  13.601 - * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
  13.602 - *
  13.603 - * @example var data = $(":input").formSerialize();
  13.604 - * @desc Collect the data from all successful input, select, textarea and button elements into a query string
  13.605 - *
  13.606 - * @name fieldSerialize
  13.607 - * @param successful true if only successful controls should be serialized (default is true)
  13.608 - * @type String
  13.609 - * @cat Plugins/Form
  13.610 - */
  13.611 -$.fn.fieldSerialize = function(successful) {
  13.612 -    var a = [];
  13.613 -    this.each(function() {
  13.614 -        var n = this.name;
  13.615 -        if (!n) return;
  13.616 -        var v = $.fieldValue(this, successful);
  13.617 -        if (v && v.constructor == Array) {
  13.618 -            for (var i=0,max=v.length; i < max; i++)
  13.619 -                a.push({name: n, value: v[i]});
  13.620 -        }
  13.621 -        else if (v !== null && typeof v != 'undefined')
  13.622 -            a.push({name: this.name, value: v});
  13.623 -    });
  13.624 -    //hand off to jQuery.param for proper encoding
  13.625 -    return $.param(a);
  13.626 -};
  13.627 -
  13.628 -
  13.629 -/**
  13.630 - * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  13.631 - *
  13.632 - *  <form><fieldset>
  13.633 - *      <input name="A" type="text" />
  13.634 - *      <input name="A" type="text" />
  13.635 - *      <input name="B" type="checkbox" value="B1" />
  13.636 - *      <input name="B" type="checkbox" value="B2"/>
  13.637 - *      <input name="C" type="radio" value="C1" />
  13.638 - *      <input name="C" type="radio" value="C2" />
  13.639 - *  </fieldset></form>
  13.640 - *
  13.641 - *  var v = $(':text').fieldValue();
  13.642 - *  // if no values are entered into the text inputs
  13.643 - *  v == ['','']
  13.644 - *  // if values entered into the text inputs are 'foo' and 'bar'
  13.645 - *  v == ['foo','bar']
  13.646 - *
  13.647 - *  var v = $(':checkbox').fieldValue();
  13.648 - *  // if neither checkbox is checked
  13.649 - *  v === undefined
  13.650 - *  // if both checkboxes are checked
  13.651 - *  v == ['B1', 'B2']
  13.652 - *
  13.653 - *  var v = $(':radio').fieldValue();
  13.654 - *  // if neither radio is checked
  13.655 - *  v === undefined
  13.656 - *  // if first radio is checked
  13.657 - *  v == ['C1']
  13.658 - *
  13.659 - * The successful argument controls whether or not the field element must be 'successful'
  13.660 - * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  13.661 - * The default value of the successful argument is true.  If this value is false the value(s)
  13.662 - * for each element is returned.
  13.663 - *
  13.664 - * Note: This method *always* returns an array.  If no valid value can be determined the
  13.665 - *       array will be empty, otherwise it will contain one or more values.
  13.666 - *
  13.667 - * @example var data = $("#myPasswordElement").fieldValue();
  13.668 - * alert(data[0]);
  13.669 - * @desc Alerts the current value of the myPasswordElement element
  13.670 - *
  13.671 - * @example var data = $("#myForm :input").fieldValue();
  13.672 - * @desc Get the value(s) of the form elements in myForm
  13.673 - *
  13.674 - * @example var data = $("#myForm :checkbox").fieldValue();
  13.675 - * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
  13.676 - *
  13.677 - * @example var data = $("#mySingleSelect").fieldValue();
  13.678 - * @desc Get the value(s) of the select control
  13.679 - *
  13.680 - * @example var data = $(':text').fieldValue();
  13.681 - * @desc Get the value(s) of the text input or textarea elements
  13.682 - *
  13.683 - * @example var data = $("#myMultiSelect").fieldValue();
  13.684 - * @desc Get the values for the select-multiple control
  13.685 - *
  13.686 - * @name fieldValue
  13.687 - * @param Boolean successful true if only the values for successful controls should be returned (default is true)
  13.688 - * @type Array<String>
  13.689 - * @cat Plugins/Form
  13.690 - */
  13.691 -$.fn.fieldValue = function(successful) {
  13.692 -    for (var val=[], i=0, max=this.length; i < max; i++) {
  13.693 -        var el = this[i];
  13.694 -        var v = $.fieldValue(el, successful);
  13.695 -        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
  13.696 -            continue;
  13.697 -        v.constructor == Array ? $.merge(val, v) : val.push(v);
  13.698 -    }
  13.699 -    return val;
  13.700 -};
  13.701 -
  13.702 -/**
  13.703 - * Returns the value of the field element.
  13.704 - *
  13.705 - * The successful argument controls whether or not the field element must be 'successful'
  13.706 - * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  13.707 - * The default value of the successful argument is true.  If the given element is not
  13.708 - * successful and the successful arg is not false then the returned value will be null.
  13.709 - *
  13.710 - * Note: If the successful flag is true (default) but the element is not successful, the return will be null
  13.711 - * Note: The value returned for a successful select-multiple element will always be an array.
  13.712 - * Note: If the element has no value the return value will be undefined.
  13.713 - *
  13.714 - * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
  13.715 - * @desc Gets the current value of the myPasswordElement element
  13.716 - *
  13.717 - * @name fieldValue
  13.718 - * @param Element el The DOM element for which the value will be returned
  13.719 - * @param Boolean successful true if value returned must be for a successful controls (default is true)
  13.720 - * @type String or Array<String> or null or undefined
  13.721 - * @cat Plugins/Form
  13.722 - */
  13.723 -$.fieldValue = function(el, successful) {
  13.724 -    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
  13.725 -    if (typeof successful == 'undefined') successful = true;
  13.726 -
  13.727 -    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
  13.728 -        (t == 'checkbox' || t == 'radio') && !el.checked ||
  13.729 -        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
  13.730 -        tag == 'select' && el.selectedIndex == -1))
  13.731 -            return null;
  13.732 -
  13.733 -    if (tag == 'select') {
  13.734 -        var index = el.selectedIndex;
  13.735 -        if (index < 0) return null;
  13.736 -        var a = [], ops = el.options;
  13.737 -        var one = (t == 'select-one');
  13.738 -        var max = (one ? index+1 : ops.length);
  13.739 -        for(var i=(one ? index : 0); i < max; i++) {
  13.740 -            var op = ops[i];
  13.741 -            if (op.selected) {
  13.742 -                // extra pain for IE...
  13.743 -                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
  13.744 -                if (one) return v;
  13.745 -                a.push(v);
  13.746 -            }
  13.747 -        }
  13.748 -        return a;
  13.749 -    }
  13.750 -    return el.value;
  13.751 -};
  13.752 -
  13.753 -
  13.754 -/**
  13.755 - * Clears the form data.  Takes the following actions on the form's input fields:
  13.756 - *  - input text fields will have their 'value' property set to the empty string
  13.757 - *  - select elements will have their 'selectedIndex' property set to -1
  13.758 - *  - checkbox and radio inputs will have their 'checked' property set to false
  13.759 - *  - inputs of type submit, button, reset, and hidden will *not* be effected
  13.760 - *  - button elements will *not* be effected
  13.761 - *
  13.762 - * @example $('form').clearForm();
  13.763 - * @desc Clears all forms on the page.
  13.764 - *
  13.765 - * @name clearForm
  13.766 - * @type jQuery
  13.767 - * @cat Plugins/Form
  13.768 - */
  13.769 -$.fn.clearForm = function() {
  13.770 -    return this.each(function() {
  13.771 -        $('input,select,textarea', this).clearFields();
  13.772 -    });
  13.773 -};
  13.774 -
  13.775 -/**
  13.776 - * Clears the selected form elements.  Takes the following actions on the matched elements:
  13.777 - *  - input text fields will have their 'value' property set to the empty string
  13.778 - *  - select elements will have their 'selectedIndex' property set to -1
  13.779 - *  - checkbox and radio inputs will have their 'checked' property set to false
  13.780 - *  - inputs of type submit, button, reset, and hidden will *not* be effected
  13.781 - *  - button elements will *not* be effected
  13.782 - *
  13.783 - * @example $('.myInputs').clearFields();
  13.784 - * @desc Clears all inputs with class myInputs
  13.785 - *
  13.786 - * @name clearFields
  13.787 - * @type jQuery
  13.788 - * @cat Plugins/Form
  13.789 - */
  13.790 -$.fn.clearFields = $.fn.clearInputs = function() {
  13.791 -    return this.each(function() {
  13.792 -        var t = this.type, tag = this.tagName.toLowerCase();
  13.793 -        if (t == 'text' || t == 'password' || tag == 'textarea')
  13.794 -            this.value = '';
  13.795 -        else if (t == 'checkbox' || t == 'radio')
  13.796 -            this.checked = false;
  13.797 -        else if (tag == 'select')
  13.798 -            this.selectedIndex = -1;
  13.799 -    });
  13.800 -};
  13.801 -
  13.802 -
  13.803 -/**
  13.804 - * Resets the form data.  Causes all form elements to be reset to their original value.
  13.805 - *
  13.806 - * @example $('form').resetForm();
  13.807 - * @desc Resets all forms on the page.
  13.808 - *
  13.809 - * @name resetForm
  13.810 - * @type jQuery
  13.811 - * @cat Plugins/Form
  13.812 - */
  13.813 -$.fn.resetForm = function() {
  13.814 -    return this.each(function() {
  13.815 -        // guard against an input with the name of 'reset'
  13.816 -        // note that IE reports the reset function as an 'object'
  13.817 -        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
  13.818 -            this.reset();
  13.819 -    });
  13.820 -};
  13.821 -
  13.822 -})(jQuery);
    14.1 --- a/web/javascript/jquery-min.js	Mon Oct 26 14:12:27 2009 +0100
    14.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    14.3 @@ -1,31 +0,0 @@
    14.4 -/*
    14.5 - * jQuery 1.2.1 - New Wave Javascript
    14.6 - *
    14.7 - * Copyright (c) 2007 John Resig (jquery.com)
    14.8 - * Dual licensed under the MIT (MIT-LICENSE.txt)
    14.9 - * and GPL (GPL-LICENSE.txt) licenses.
   14.10 - *
   14.11 - * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   14.12 - * $Rev: 3353 $
   14.13 - */
   14.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
   14.15 -selector=[];}}else
   14.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
   14.17 -return this[0].value.replace(/\r/g,"");}}else
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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
   14.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;}};})();
   14.35 \ No newline at end of file
    15.1 --- a/web/javascript/jquery.js	Mon Oct 26 14:12:27 2009 +0100
    15.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    15.3 @@ -1,2992 +0,0 @@
    15.4 -(function(){
    15.5 -/*
    15.6 - * jQuery 1.2.1 - New Wave Javascript
    15.7 - *
    15.8 - * Copyright (c) 2007 John Resig (jquery.com)
    15.9 - * Dual licensed under the MIT (MIT-LICENSE.txt)
   15.10 - * and GPL (GPL-LICENSE.txt) licenses.
   15.11 - *
   15.12 - * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   15.13 - * $Rev: 3353 $
   15.14 - */
   15.15 -
   15.16 -// Map over jQuery in case of overwrite
   15.17 -if ( typeof jQuery != "undefined" )
   15.18 -	var _jQuery = jQuery;
   15.19 -
   15.20 -var jQuery = window.jQuery = function(selector, context) {
   15.21 -	// If the context is a namespace object, return a new object
   15.22 -	return this instanceof jQuery ?
   15.23 -		this.init(selector, context) :
   15.24 -		new jQuery(selector, context);
   15.25 -};
   15.26 -
   15.27 -// Map over the $ in case of overwrite
   15.28 -if ( typeof $ != "undefined" )
   15.29 -	var _$ = $;
   15.30 -	
   15.31 -// Map the jQuery namespace to the '$' one
   15.32 -window.$ = jQuery;
   15.33 -
   15.34 -var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
   15.35 -
   15.36 -jQuery.fn = jQuery.prototype = {
   15.37 -	init: function(selector, context) {
   15.38 -		// Make sure that a selection was provided
   15.39 -		selector = selector || document;
   15.40 -
   15.41 -		// Handle HTML strings
   15.42 -		if ( typeof selector  == "string" ) {
   15.43 -			var m = quickExpr.exec(selector);
   15.44 -			if ( m && (m[1] || !context) ) {
   15.45 -				// HANDLE: $(html) -> $(array)
   15.46 -				if ( m[1] )
   15.47 -					selector = jQuery.clean( [ m[1] ], context );
   15.48 -
   15.49 -				// HANDLE: $("#id")
   15.50 -				else {
   15.51 -					var tmp = document.getElementById( m[3] );
   15.52 -					if ( tmp )
   15.53 -						// Handle the case where IE and Opera return items
   15.54 -						// by name instead of ID
   15.55 -						if ( tmp.id != m[3] )
   15.56 -							return jQuery().find( selector );
   15.57 -						else {
   15.58 -							this[0] = tmp;
   15.59 -							this.length = 1;
   15.60 -							return this;
   15.61 -						}
   15.62 -					else
   15.63 -						selector = [];
   15.64 -				}
   15.65 -
   15.66 -			// HANDLE: $(expr)
   15.67 -			} else
   15.68 -				return new jQuery( context ).find( selector );
   15.69 -
   15.70 -		// HANDLE: $(function)
   15.71 -		// Shortcut for document ready
   15.72 -		} else if ( jQuery.isFunction(selector) )
   15.73 -			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
   15.74 -
   15.75 -		return this.setArray(
   15.76 -			// HANDLE: $(array)
   15.77 -			selector.constructor == Array && selector ||
   15.78 -
   15.79 -			// HANDLE: $(arraylike)
   15.80 -			// Watch for when an array-like object is passed as the selector
   15.81 -			(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
   15.82 -
   15.83 -			// HANDLE: $(*)
   15.84 -			[ selector ] );
   15.85 -	},
   15.86 -	
   15.87 -	jquery: "1.2.1",
   15.88 -
   15.89 -	size: function() {
   15.90 -		return this.length;
   15.91 -	},
   15.92 -	
   15.93 -	length: 0,
   15.94 -
   15.95 -	get: function( num ) {
   15.96 -		return num == undefined ?
   15.97 -
   15.98 -			// Return a 'clean' array
   15.99 -			jQuery.makeArray( this ) :
  15.100 -
  15.101 -			// Return just the object
  15.102 -			this[num];
  15.103 -	},
  15.104 -	
  15.105 -	pushStack: function( a ) {
  15.106 -		var ret = jQuery(a);
  15.107 -		ret.prevObject = this;
  15.108 -		return ret;
  15.109 -	},
  15.110 -	
  15.111 -	setArray: function( a ) {
  15.112 -		this.length = 0;
  15.113 -		Array.prototype.push.apply( this, a );
  15.114 -		return this;
  15.115 -	},
  15.116 -
  15.117 -	each: function( fn, args ) {
  15.118 -		return jQuery.each( this, fn, args );
  15.119 -	},
  15.120 -
  15.121 -	index: function( obj ) {
  15.122 -		var pos = -1;
  15.123 -		this.each(function(i){
  15.124 -			if ( this == obj ) pos = i;
  15.125 -		});
  15.126 -		return pos;
  15.127 -	},
  15.128 -
  15.129 -	attr: function( key, value, type ) {
  15.130 -		var obj = key;
  15.131 -		
  15.132 -		// Look for the case where we're accessing a style value
  15.133 -		if ( key.constructor == String )
  15.134 -			if ( value == undefined )
  15.135 -				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
  15.136 -			else {
  15.137 -				obj = {};
  15.138 -				obj[ key ] = value;
  15.139 -			}
  15.140 -		
  15.141 -		// Check to see if we're setting style values
  15.142 -		return this.each(function(index){
  15.143 -			// Set all the styles
  15.144 -			for ( var prop in obj )
  15.145 -				jQuery.attr(
  15.146 -					type ? this.style : this,
  15.147 -					prop, jQuery.prop(this, obj[prop], type, index, prop)
  15.148 -				);
  15.149 -		});
  15.150 -	},
  15.151 -
  15.152 -	css: function( key, value ) {
  15.153 -		return this.attr( key, value, "curCSS" );
  15.154 -	},
  15.155 -
  15.156 -	text: function(e) {
  15.157 -		if ( typeof e != "object" && e != null )
  15.158 -			return this.empty().append( document.createTextNode( e ) );
  15.159 -
  15.160 -		var t = "";
  15.161 -		jQuery.each( e || this, function(){
  15.162 -			jQuery.each( this.childNodes, function(){
  15.163 -				if ( this.nodeType != 8 )
  15.164 -					t += this.nodeType != 1 ?
  15.165 -						this.nodeValue : jQuery.fn.text([ this ]);
  15.166 -			});
  15.167 -		});
  15.168 -		return t;
  15.169 -	},
  15.170 -
  15.171 -	wrapAll: function(html) {
  15.172 -		if ( this[0] )
  15.173 -			// The elements to wrap the target around
  15.174 -			jQuery(html, this[0].ownerDocument)
  15.175 -				.clone()
  15.176 -				.insertBefore(this[0])
  15.177 -				.map(function(){
  15.178 -					var elem = this;
  15.179 -					while ( elem.firstChild )
  15.180 -						elem = elem.firstChild;
  15.181 -					return elem;
  15.182 -				})
  15.183 -				.append(this);
  15.184 -
  15.185 -		return this;
  15.186 -	},
  15.187 -
  15.188 -	wrapInner: function(html) {
  15.189 -		return this.each(function(){
  15.190 -			jQuery(this).contents().wrapAll(html);
  15.191 -		});
  15.192 -	},
  15.193 -
  15.194 -	wrap: function(html) {
  15.195 -		return this.each(function(){
  15.196 -			jQuery(this).wrapAll(html);
  15.197 -		});
  15.198 -	},
  15.199 -
  15.200 -	append: function() {
  15.201 -		return this.domManip(arguments, true, 1, function(a){
  15.202 -			this.appendChild( a );
  15.203 -		});
  15.204 -	},
  15.205 -
  15.206 -	prepend: function() {
  15.207 -		return this.domManip(arguments, true, -1, function(a){
  15.208 -			this.insertBefore( a, this.firstChild );
  15.209 -		});
  15.210 -	},
  15.211 -	
  15.212 -	before: function() {
  15.213 -		return this.domManip(arguments, false, 1, function(a){
  15.214 -			this.parentNode.insertBefore( a, this );
  15.215 -		});
  15.216 -	},
  15.217 -
  15.218 -	after: function() {
  15.219 -		return this.domManip(arguments, false, -1, function(a){
  15.220 -			this.parentNode.insertBefore( a, this.nextSibling );
  15.221 -		});
  15.222 -	},
  15.223 -
  15.224 -	end: function() {
  15.225 -		return this.prevObject || jQuery([]);
  15.226 -	},
  15.227 -
  15.228 -	find: function(t) {
  15.229 -		var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
  15.230 -		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
  15.231 -			jQuery.unique( data ) : data );
  15.232 -	},
  15.233 -
  15.234 -	clone: function(events) {
  15.235 -		// Do the clone
  15.236 -		var ret = this.map(function(){
  15.237 -			return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
  15.238 -		});
  15.239 -
  15.240 -		// Need to set the expando to null on the cloned set if it exists
  15.241 -		// removeData doesn't work here, IE removes it from the original as well
  15.242 -		// this is primarily for IE but the data expando shouldn't be copied over in any browser
  15.243 -		var clone = ret.find("*").andSelf().each(function(){
  15.244 -			if ( this[ expando ] != undefined )
  15.245 -				this[ expando ] = null;
  15.246 -		});
  15.247 -		
  15.248 -		// Copy the events from the original to the clone
  15.249 -		if (events === true)
  15.250 -			this.find("*").andSelf().each(function(i) {
  15.251 -				var events = jQuery.data(this, "events");
  15.252 -				for ( var type in events )
  15.253 -					for ( var handler in events[type] )
  15.254 -						jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
  15.255 -			});
  15.256 -
  15.257 -		// Return the cloned set
  15.258 -		return ret;
  15.259 -	},
  15.260 -
  15.261 -	filter: function(t) {
  15.262 -		return this.pushStack(
  15.263 -			jQuery.isFunction( t ) &&
  15.264 -			jQuery.grep(this, function(el, index){
  15.265 -				return t.apply(el, [index]);
  15.266 -			}) ||
  15.267 -
  15.268 -			jQuery.multiFilter(t,this) );
  15.269 -	},
  15.270 -
  15.271 -	not: function(t) {
  15.272 -		return this.pushStack(
  15.273 -			t.constructor == String &&
  15.274 -			jQuery.multiFilter(t, this, true) ||
  15.275 -
  15.276 -			jQuery.grep(this, function(a) {
  15.277 -				return ( t.constructor == Array || t.jquery )
  15.278 -					? jQuery.inArray( a, t ) < 0
  15.279 -					: a != t;
  15.280 -			})
  15.281 -		);
  15.282 -	},
  15.283 -
  15.284 -	add: function(t) {
  15.285 -		return this.pushStack( jQuery.merge(
  15.286 -			this.get(),
  15.287 -			t.constructor == String ?
  15.288 -				jQuery(t).get() :
  15.289 -				t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
  15.290 -					t : [t] )
  15.291 -		);
  15.292 -	},
  15.293 -
  15.294 -	is: function(expr) {
  15.295 -		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
  15.296 -	},
  15.297 -
  15.298 -	hasClass: function(expr) {
  15.299 -		return this.is("." + expr);
  15.300 -	},
  15.301 -	
  15.302 -	val: function( val ) {
  15.303 -		if ( val == undefined ) {
  15.304 -			if ( this.length ) {
  15.305 -				var elem = this[0];
  15.306 -		    	
  15.307 -				// We need to handle select boxes special
  15.308 -				if ( jQuery.nodeName(elem, "select") ) {
  15.309 -					var index = elem.selectedIndex,
  15.310 -						a = [],
  15.311 -						options = elem.options,
  15.312 -						one = elem.type == "select-one";
  15.313 -					
  15.314 -					// Nothing was selected
  15.315 -					if ( index < 0 )
  15.316 -						return null;
  15.317 -
  15.318 -					// Loop through all the selected options
  15.319 -					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  15.320 -						var option = options[i];
  15.321 -						if ( option.selected ) {
  15.322 -							// Get the specifc value for the option
  15.323 -							var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
  15.324 -							
  15.325 -							// We don't need an array for one selects
  15.326 -							if ( one )
  15.327 -								return val;
  15.328 -							
  15.329 -							// Multi-Selects return an array
  15.330 -							a.push(val);
  15.331 -						}
  15.332 -					}
  15.333 -					
  15.334 -					return a;
  15.335 -					
  15.336 -				// Everything else, we just grab the value
  15.337 -				} else
  15.338 -					return this[0].value.replace(/\r/g, "");
  15.339 -			}
  15.340 -		} else
  15.341 -			return this.each(function(){
  15.342 -				if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
  15.343 -					this.checked = (jQuery.inArray(this.value, val) >= 0 ||
  15.344 -						jQuery.inArray(this.name, val) >= 0);
  15.345 -				else if ( jQuery.nodeName(this, "select") ) {
  15.346 -					var tmp = val.constructor == Array ? val : [val];
  15.347 -
  15.348 -					jQuery("option", this).each(function(){
  15.349 -						this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
  15.350 -						jQuery.inArray(this.text, tmp) >= 0);
  15.351 -					});
  15.352 -
  15.353 -					if ( !tmp.length )
  15.354 -						this.selectedIndex = -1;
  15.355 -				} else
  15.356 -					this.value = val;
  15.357 -			});
  15.358 -	},
  15.359 -	
  15.360 -	html: function( val ) {
  15.361 -		return val == undefined ?
  15.362 -			( this.length ? this[0].innerHTML : null ) :
  15.363 -			this.empty().append( val );
  15.364 -	},
  15.365 -
  15.366 -	replaceWith: function( val ) {
  15.367 -		return this.after( val ).remove();
  15.368 -	},
  15.369 -
  15.370 -	eq: function(i){
  15.371 -		return this.slice(i, i+1);
  15.372 -	},
  15.373 -
  15.374 -	slice: function() {
  15.375 -		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
  15.376 -	},
  15.377 -
  15.378 -	map: function(fn) {
  15.379 -		return this.pushStack(jQuery.map( this, function(elem,i){
  15.380 -			return fn.call( elem, i, elem );
  15.381 -		}));
  15.382 -	},
  15.383 -
  15.384 -	andSelf: function() {
  15.385 -		return this.add( this.prevObject );
  15.386 -	},
  15.387 -	
  15.388 -	domManip: function(args, table, dir, fn) {
  15.389 -		var clone = this.length > 1, a; 
  15.390 -
  15.391 -		return this.each(function(){
  15.392 -			if ( !a ) {
  15.393 -				a = jQuery.clean(args, this.ownerDocument);
  15.394 -				if ( dir < 0 )
  15.395 -					a.reverse();
  15.396 -			}
  15.397 -
  15.398 -			var obj = this;
  15.399 -
  15.400 -			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
  15.401 -				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
  15.402 -
  15.403 -			jQuery.each( a, function(){
  15.404 -				var elem = clone ? this.cloneNode(true) : this;
  15.405 -				if ( !evalScript(0, elem) )
  15.406 -					fn.call( obj, elem );
  15.407 -			});
  15.408 -		});
  15.409 -	}
  15.410 -};
  15.411 -
  15.412 -function evalScript(i, elem){
  15.413 -	var script = jQuery.nodeName(elem, "script");
  15.414 -
  15.415 -	if ( script ) {
  15.416 -		if ( elem.src )
  15.417 -			jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
  15.418 -		else
  15.419 -			jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  15.420 -	
  15.421 -		if ( elem.parentNode )
  15.422 -			elem.parentNode.removeChild(elem);
  15.423 -
  15.424 -	} else if ( elem.nodeType == 1 )
  15.425 -    jQuery("script", elem).each(evalScript);
  15.426 -
  15.427 -	return script;
  15.428 -}
  15.429 -
  15.430 -jQuery.extend = jQuery.fn.extend = function() {
  15.431 -	// copy reference to target object
  15.432 -	var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
  15.433 -
  15.434 -	// Handle a deep copy situation
  15.435 -	if ( target.constructor == Boolean ) {
  15.436 -		deep = target;
  15.437 -		target = arguments[1] || {};
  15.438 -	}
  15.439 -
  15.440 -	// extend jQuery itself if only one argument is passed
  15.441 -	if ( al == 1 ) {
  15.442 -		target = this;
  15.443 -		a = 0;
  15.444 -	}
  15.445 -
  15.446 -	var prop;
  15.447 -
  15.448 -	for ( ; a < al; a++ )
  15.449 -		// Only deal with non-null/undefined values
  15.450 -		if ( (prop = arguments[a]) != null )
  15.451 -			// Extend the base object
  15.452 -			for ( var i in prop ) {
  15.453 -				// Prevent never-ending loop
  15.454 -				if ( target == prop[i] )
  15.455 -					continue;
  15.456 -
  15.457 -				// Recurse if we're merging object values
  15.458 -				if ( deep && typeof prop[i] == 'object' && target[i] )
  15.459 -					jQuery.extend( target[i], prop[i] );
  15.460 -
  15.461 -				// Don't bring in undefined values
  15.462 -				else if ( prop[i] != undefined )
  15.463 -					target[i] = prop[i];
  15.464 -			}
  15.465 -
  15.466 -	// Return the modified object
  15.467 -	return target;
  15.468 -};
  15.469 -
  15.470 -var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
  15.471 -
  15.472 -jQuery.extend({
  15.473 -	noConflict: function(deep) {
  15.474 -		window.$ = _$;
  15.475 -		if ( deep )
  15.476 -			window.jQuery = _jQuery;
  15.477 -		return jQuery;
  15.478 -	},
  15.479 -
  15.480 -	// This may seem like some crazy code, but trust me when I say that this
  15.481 -	// is the only cross-browser way to do this. --John
  15.482 -	isFunction: function( fn ) {
  15.483 -		return !!fn && typeof fn != "string" && !fn.nodeName && 
  15.484 -			fn.constructor != Array && /function/i.test( fn + "" );
  15.485 -	},
  15.486 -	
  15.487 -	// check if an element is in a XML document
  15.488 -	isXMLDoc: function(elem) {
  15.489 -		return elem.documentElement && !elem.body ||
  15.490 -			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
  15.491 -	},
  15.492 -
  15.493 -	// Evalulates a script in a global context
  15.494 -	// Evaluates Async. in Safari 2 :-(
  15.495 -	globalEval: function( data ) {
  15.496 -		data = jQuery.trim( data );
  15.497 -		if ( data ) {
  15.498 -			if ( window.execScript )
  15.499 -				window.execScript( data );
  15.500 -			else if ( jQuery.browser.safari )
  15.501 -				// safari doesn't provide a synchronous global eval
  15.502 -				window.setTimeout( data, 0 );
  15.503 -			else
  15.504 -				eval.call( window, data );
  15.505 -		}
  15.506 -	},
  15.507 -
  15.508 -	nodeName: function( elem, name ) {
  15.509 -		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  15.510 -	},
  15.511 -	
  15.512 -	cache: {},
  15.513 -	
  15.514 -	data: function( elem, name, data ) {
  15.515 -		elem = elem == window ? win : elem;
  15.516 -
  15.517 -		var id = elem[ expando ];
  15.518 -
  15.519 -		// Compute a unique ID for the element
  15.520 -		if ( !id ) 
  15.521 -			id = elem[ expando ] = ++uuid;
  15.522 -
  15.523 -		// Only generate the data cache if we're
  15.524 -		// trying to access or manipulate it
  15.525 -		if ( name && !jQuery.cache[ id ] )
  15.526 -			jQuery.cache[ id ] = {};
  15.527 -		
  15.528 -		// Prevent overriding the named cache with undefined values
  15.529 -		if ( data != undefined )
  15.530 -			jQuery.cache[ id ][ name ] = data;
  15.531 -		
  15.532 -		// Return the named cache data, or the ID for the element	
  15.533 -		return name ? jQuery.cache[ id ][ name ] : id;
  15.534 -	},
  15.535 -	
  15.536 -	removeData: function( elem, name ) {
  15.537 -		elem = elem == window ? win : elem;
  15.538 -
  15.539 -		var id = elem[ expando ];
  15.540 -
  15.541 -		// If we want to remove a specific section of the element's data
  15.542 -		if ( name ) {
  15.543 -			if ( jQuery.cache[ id ] ) {
  15.544 -				// Remove the section of cache data
  15.545 -				delete jQuery.cache[ id ][ name ];
  15.546 -
  15.547 -				// If we've removed all the data, remove the element's cache
  15.548 -				name = "";
  15.549 -				for ( name in jQuery.cache[ id ] ) break;
  15.550 -				if ( !name )
  15.551 -					jQuery.removeData( elem );
  15.552 -			}
  15.553 -
  15.554 -		// Otherwise, we want to remove all of the element's data
  15.555 -		} else {
  15.556 -			// Clean up the element expando
  15.557 -			try {
  15.558 -				delete elem[ expando ];
  15.559 -			} catch(e){
  15.560 -				// IE has trouble directly removing the expando
  15.561 -				// but it's ok with using removeAttribute
  15.562 -				if ( elem.removeAttribute )
  15.563 -					elem.removeAttribute( expando );
  15.564 -			}
  15.565 -
  15.566 -			// Completely remove the data cache
  15.567 -			delete jQuery.cache[ id ];
  15.568 -		}
  15.569 -	},
  15.570 -
  15.571 -	// args is for internal usage only
  15.572 -	each: function( obj, fn, args ) {
  15.573 -		if ( args ) {
  15.574 -			if ( obj.length == undefined )
  15.575 -				for ( var i in obj )
  15.576 -					fn.apply( obj[i], args );
  15.577 -			else
  15.578 -				for ( var i = 0, ol = obj.length; i < ol; i++ )
  15.579 -					if ( fn.apply( obj[i], args ) === false ) break;
  15.580 -
  15.581 -		// A special, fast, case for the most common use of each
  15.582 -		} else {
  15.583 -			if ( obj.length == undefined )
  15.584 -				for ( var i in obj )
  15.585 -					fn.call( obj[i], i, obj[i] );
  15.586 -			else
  15.587 -				for ( var i = 0, ol = obj.length, val = obj[0]; 
  15.588 -					i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
  15.589 -		}
  15.590 -
  15.591 -		return obj;
  15.592 -	},
  15.593 -	
  15.594 -	prop: function(elem, value, type, index, prop){
  15.595 -			// Handle executable functions
  15.596 -			if ( jQuery.isFunction( value ) )
  15.597 -				value = value.call( elem, [index] );
  15.598 -				
  15.599 -			// exclude the following css properties to add px
  15.600 -			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
  15.601 -
  15.602 -			// Handle passing in a number to a CSS property
  15.603 -			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
  15.604 -				value + "px" :
  15.605 -				value;
  15.606 -	},
  15.607 -
  15.608 -	className: {
  15.609 -		// internal only, use addClass("class")
  15.610 -		add: function( elem, c ){
  15.611 -			jQuery.each( (c || "").split(/\s+/), function(i, cur){
  15.612 -				if ( !jQuery.className.has( elem.className, cur ) )
  15.613 -					elem.className += ( elem.className ? " " : "" ) + cur;
  15.614 -			});
  15.615 -		},
  15.616 -
  15.617 -		// internal only, use removeClass("class")
  15.618 -		remove: function( elem, c ){
  15.619 -			elem.className = c != undefined ?
  15.620 -				jQuery.grep( elem.className.split(/\s+/), function(cur){
  15.621 -					return !jQuery.className.has( c, cur );	
  15.622 -				}).join(" ") : "";
  15.623 -		},
  15.624 -
  15.625 -		// internal only, use is(".class")
  15.626 -		has: function( t, c ) {
  15.627 -			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
  15.628 -		}
  15.629 -	},
  15.630 -
  15.631 -	swap: function(e,o,f) {
  15.632 -		for ( var i in o ) {
  15.633 -			e.style["old"+i] = e.style[i];
  15.634 -			e.style[i] = o[i];
  15.635 -		}
  15.636 -		f.apply( e, [] );
  15.637 -		for ( var i in o )
  15.638 -			e.style[i] = e.style["old"+i];
  15.639 -	},
  15.640 -
  15.641 -	css: function(e,p) {
  15.642 -		if ( p == "height" || p == "width" ) {
  15.643 -			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
  15.644 -
  15.645 -			jQuery.each( d, function(){
  15.646 -				old["padding" + this] = 0;
  15.647 -				old["border" + this + "Width"] = 0;
  15.648 -			});
  15.649 -
  15.650 -			jQuery.swap( e, old, function() {
  15.651 -				if ( jQuery(e).is(':visible') ) {
  15.652 -					oHeight = e.offsetHeight;
  15.653 -					oWidth = e.offsetWidth;
  15.654 -				} else {
  15.655 -					e = jQuery(e.cloneNode(true))
  15.656 -						.find(":radio").removeAttr("checked").end()
  15.657 -						.css({
  15.658 -							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
  15.659 -						}).appendTo(e.parentNode)[0];
  15.660 -
  15.661 -					var parPos = jQuery.css(e.parentNode,"position") || "static";
  15.662 -					if ( parPos == "static" )
  15.663 -						e.parentNode.style.position = "relative";
  15.664 -
  15.665 -					oHeight = e.clientHeight;
  15.666 -					oWidth = e.clientWidth;
  15.667 -
  15.668 -					if ( parPos == "static" )
  15.669 -						e.parentNode.style.position = "static";
  15.670 -
  15.671 -					e.parentNode.removeChild(e);
  15.672 -				}
  15.673 -			});
  15.674 -
  15.675 -			return p == "height" ? oHeight : oWidth;
  15.676 -		}
  15.677 -
  15.678 -		return jQuery.curCSS( e, p );
  15.679 -	},
  15.680 -
  15.681 -	curCSS: function(elem, prop, force) {
  15.682 -		var ret, stack = [], swap = [];
  15.683 -
  15.684 -		// A helper method for determining if an element's values are broken
  15.685 -		function color(a){
  15.686 -			if ( !jQuery.browser.safari )
  15.687 -				return false;
  15.688 -
  15.689 -			var ret = document.defaultView.getComputedStyle(a,null);
  15.690 -			return !ret || ret.getPropertyValue("color") == "";
  15.691 -		}
  15.692 -
  15.693 -		if (prop == "opacity" && jQuery.browser.msie) {
  15.694 -			ret = jQuery.attr(elem.style, "opacity");
  15.695 -			return ret == "" ? "1" : ret;
  15.696 -		}
  15.697 -		
  15.698 -		if (prop.match(/float/i))
  15.699 -			prop = styleFloat;
  15.700 -
  15.701 -		if (!force && elem.style[prop])
  15.702 -			ret = elem.style[prop];
  15.703 -
  15.704 -		else if (document.defaultView && document.defaultView.getComputedStyle) {
  15.705 -
  15.706 -			if (prop.match(/float/i))
  15.707 -				prop = "float";
  15.708 -
  15.709 -			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
  15.710 -			var cur = document.defaultView.getComputedStyle(elem, null);
  15.711 -
  15.712 -			if ( cur && !color(elem) )
  15.713 -				ret = cur.getPropertyValue(prop);
  15.714 -
  15.715 -			// If the element isn't reporting its values properly in Safari
  15.716 -			// then some display: none elements are involved
  15.717 -			else {
  15.718 -				// Locate all of the parent display: none elements
  15.719 -				for ( var a = elem; a && color(a); a = a.parentNode )
  15.720 -					stack.unshift(a);
  15.721 -
  15.722 -				// Go through and make them visible, but in reverse
  15.723 -				// (It would be better if we knew the exact display type that they had)
  15.724 -				for ( a = 0; a < stack.length; a++ )
  15.725 -					if ( color(stack[a]) ) {
  15.726 -						swap[a] = stack[a].style.display;
  15.727 -						stack[a].style.display = "block";
  15.728 -					}
  15.729 -
  15.730 -				// Since we flip the display style, we have to handle that
  15.731 -				// one special, otherwise get the value
  15.732 -				ret = prop == "display" && swap[stack.length-1] != null ?
  15.733 -					"none" :
  15.734 -					document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
  15.735 -
  15.736 -				// Finally, revert the display styles back
  15.737 -				for ( a = 0; a < swap.length; a++ )
  15.738 -					if ( swap[a] != null )
  15.739 -						stack[a].style.display = swap[a];
  15.740 -			}
  15.741 -
  15.742 -			if ( prop == "opacity" && ret == "" )
  15.743 -				ret = "1";
  15.744 -
  15.745 -		} else if (elem.currentStyle) {
  15.746 -			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
  15.747 -			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
  15.748 -
  15.749 -			// From the awesome hack by Dean Edwards
  15.750 -			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  15.751 -
  15.752 -			// If we're not dealing with a regular pixel number
  15.753 -			// but a number that has a weird ending, we need to convert it to pixels
  15.754 -			if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
  15.755 -				var style = elem.style.left;
  15.756 -				var runtimeStyle = elem.runtimeStyle.left;
  15.757 -				elem.runtimeStyle.left = elem.currentStyle.left;
  15.758 -				elem.style.left = ret || 0;
  15.759 -				ret = elem.style.pixelLeft + "px";
  15.760 -				elem.style.left = style;
  15.761 -				elem.runtimeStyle.left = runtimeStyle;
  15.762 -			}
  15.763 -		}
  15.764 -
  15.765 -		return ret;
  15.766 -	},
  15.767 -	
  15.768 -	clean: function(a, doc) {
  15.769 -		var r = [];
  15.770 -		doc = doc || document;
  15.771 -
  15.772 -		jQuery.each( a, function(i,arg){
  15.773 -			if ( !arg ) return;
  15.774 -
  15.775 -			if ( arg.constructor == Number )
  15.776 -				arg = arg.toString();
  15.777 -			
  15.778 -			// Convert html string into DOM nodes
  15.779 -			if ( typeof arg == "string" ) {
  15.780 -				// Fix "XHTML"-style tags in all browsers
  15.781 -				arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
  15.782 -					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
  15.783 -				});
  15.784 -
  15.785 -				// Trim whitespace, otherwise indexOf won't work as expected
  15.786 -				var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
  15.787 -
  15.788 -				var wrap =
  15.789 -					// option or optgroup
  15.790 -					!s.indexOf("<opt") &&
  15.791 -					[1, "<select>", "</select>"] ||
  15.792 -					
  15.793 -					!s.indexOf("<leg") &&
  15.794 -					[1, "<fieldset>", "</fieldset>"] ||
  15.795 -					
  15.796 -					s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  15.797 -					[1, "<table>", "</table>"] ||
  15.798 -					
  15.799 -					!s.indexOf("<tr") &&
  15.800 -					[2, "<table><tbody>", "</tbody></table>"] ||
  15.801 -					
  15.802 -				 	// <thead> matched above
  15.803 -					(!s.indexOf("<td") || !s.indexOf("<th")) &&
  15.804 -					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
  15.805 -					
  15.806 -					!s.indexOf("<col") &&
  15.807 -					[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
  15.808 -
  15.809 -					// IE can't serialize <link> and <script> tags normally
  15.810 -					jQuery.browser.msie &&
  15.811 -					[1, "div<div>", "</div>"] ||
  15.812 -					
  15.813 -					[0,"",""];
  15.814 -
  15.815 -				// Go to html and back, then peel off extra wrappers
  15.816 -				div.innerHTML = wrap[1] + arg + wrap[2];
  15.817 -				
  15.818 -				// Move to the right depth
  15.819 -				while ( wrap[0]-- )
  15.820 -					div = div.lastChild;
  15.821 -				
  15.822 -				// Remove IE's autoinserted <tbody> from table fragments
  15.823 -				if ( jQuery.browser.msie ) {
  15.824 -					
  15.825 -					// String was a <table>, *may* have spurious <tbody>
  15.826 -					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
  15.827 -						tb = div.firstChild && div.firstChild.childNodes;
  15.828 -						
  15.829 -					// String was a bare <thead> or <tfoot>
  15.830 -					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
  15.831 -						tb = div.childNodes;
  15.832 -
  15.833 -					for ( var n = tb.length-1; n >= 0 ; --n )
  15.834 -						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
  15.835 -							tb[n].parentNode.removeChild(tb[n]);
  15.836 -	
  15.837 -					// IE completely kills leading whitespace when innerHTML is used	
  15.838 -					if ( /^\s/.test(arg) )	
  15.839 -						div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
  15.840 -
  15.841 -				}
  15.842 -				
  15.843 -				arg = jQuery.makeArray( div.childNodes );
  15.844 -			}
  15.845 -
  15.846 -			if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
  15.847 -				return;
  15.848 -
  15.849 -			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
  15.850 -				r.push( arg );
  15.851 -			else
  15.852 -				r = jQuery.merge( r, arg );
  15.853 -
  15.854 -		});
  15.855 -
  15.856 -		return r;
  15.857 -	},
  15.858 -	
  15.859 -	attr: function(elem, name, value){
  15.860 -		var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
  15.861 -
  15.862 -		// Safari mis-reports the default selected property of a hidden option
  15.863 -		// Accessing the parent's selectedIndex property fixes it
  15.864 -		if ( name == "selected" && jQuery.browser.safari )
  15.865 -			elem.parentNode.selectedIndex;
  15.866 -		
  15.867 -		// Certain attributes only work when accessed via the old DOM 0 way
  15.868 -		if ( fix[name] ) {
  15.869 -			if ( value != undefined ) elem[fix[name]] = value;
  15.870 -			return elem[fix[name]];
  15.871 -		} else if ( jQuery.browser.msie && name == "style" )
  15.872 -			return jQuery.attr( elem.style, "cssText", value );
  15.873 -
  15.874 -		else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
  15.875 -			return elem.getAttributeNode(name).nodeValue;
  15.876 -
  15.877 -		// IE elem.getAttribute passes even for style
  15.878 -		else if ( elem.tagName ) {
  15.879 -
  15.880 -			if ( value != undefined ) {
  15.881 -				if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
  15.882 -					throw "type property can't be changed";
  15.883 -				elem.setAttribute( name, value );
  15.884 -			}
  15.885 -
  15.886 -			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
  15.887 -				return elem.getAttribute( name, 2 );
  15.888 -
  15.889 -			return elem.getAttribute( name );
  15.890 -
  15.891 -		// elem is actually elem.style ... set the style
  15.892 -		} else {
  15.893 -			// IE actually uses filters for opacity
  15.894 -			if ( name == "opacity" && jQuery.browser.msie ) {
  15.895 -				if ( value != undefined ) {
  15.896 -					// IE has trouble with opacity if it does not have layout
  15.897 -					// Force it by setting the zoom level
  15.898 -					elem.zoom = 1; 
  15.899 -	
  15.900 -					// Set the alpha filter to set the opacity
  15.901 -					elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
  15.902 -						(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  15.903 -				}
  15.904 -	
  15.905 -				return elem.filter ? 
  15.906 -					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
  15.907 -			}
  15.908 -			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
  15.909 -			if ( value != undefined ) elem[name] = value;
  15.910 -			return elem[name];
  15.911 -		}
  15.912 -	},
  15.913 -	
  15.914 -	trim: function(t){
  15.915 -		return (t||"").replace(/^\s+|\s+$/g, "");
  15.916 -	},
  15.917 -
  15.918 -	makeArray: function( a ) {
  15.919 -		var r = [];
  15.920 -
  15.921 -		// Need to use typeof to fight Safari childNodes crashes
  15.922 -		if ( typeof a != "array" )
  15.923 -			for ( var i = 0, al = a.length; i < al; i++ )
  15.924 -				r.push( a[i] );
  15.925 -		else
  15.926 -			r = a.slice( 0 );
  15.927 -
  15.928 -		return r;
  15.929 -	},
  15.930 -
  15.931 -	inArray: function( b, a ) {
  15.932 -		for ( var i = 0, al = a.length; i < al; i++ )
  15.933 -			if ( a[i] == b )
  15.934 -				return i;
  15.935 -		return -1;
  15.936 -	},
  15.937 -
  15.938 -	merge: function(first, second) {
  15.939 -		// We have to loop this way because IE & Opera overwrite the length
  15.940 -		// expando of getElementsByTagName
  15.941 -
  15.942 -		// Also, we need to make sure that the correct elements are being returned
  15.943 -		// (IE returns comment nodes in a '*' query)
  15.944 -		if ( jQuery.browser.msie ) {
  15.945 -			for ( var i = 0; second[i]; i++ )
  15.946 -				if ( second[i].nodeType != 8 )
  15.947 -					first.push(second[i]);
  15.948 -		} else
  15.949 -			for ( var i = 0; second[i]; i++ )
  15.950 -				first.push(second[i]);
  15.951 -
  15.952 -		return first;
  15.953 -	},
  15.954 -
  15.955 -	unique: function(first) {
  15.956 -		var r = [], done = {};
  15.957 -
  15.958 -		try {
  15.959 -			for ( var i = 0, fl = first.length; i < fl; i++ ) {
  15.960 -				var id = jQuery.data(first[i]);
  15.961 -				if ( !done[id] ) {
  15.962 -					done[id] = true;
  15.963 -					r.push(first[i]);
  15.964 -				}
  15.965 -			}
  15.966 -		} catch(e) {
  15.967 -			r = first;
  15.968 -		}
  15.969 -
  15.970 -		return r;
  15.971 -	},
  15.972 -
  15.973 -	grep: function(elems, fn, inv) {
  15.974 -		// If a string is passed in for the function, make a function
  15.975 -		// for it (a handy shortcut)
  15.976 -		if ( typeof fn == "string" )
  15.977 -			fn = eval("false||function(a,i){return " + fn + "}");
  15.978 -
  15.979 -		var result = [];
  15.980 -
  15.981 -		// Go through the array, only saving the items
  15.982 -		// that pass the validator function
  15.983 -		for ( var i = 0, el = elems.length; i < el; i++ )
  15.984 -			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
  15.985 -				result.push( elems[i] );
  15.986 -
  15.987 -		return result;
  15.988 -	},
  15.989 -
  15.990 -	map: function(elems, fn) {
  15.991 -		// If a string is passed in for the function, make a function
  15.992 -		// for it (a handy shortcut)
  15.993 -		if ( typeof fn == "string" )
  15.994 -			fn = eval("false||function(a){return " + fn + "}");
  15.995 -
  15.996 -		var result = [];
  15.997 -
  15.998 -		// Go through the array, translating each of the items to their
  15.999 -		// new value (or values).
 15.1000 -		for ( var i = 0, el = elems.length; i < el; i++ ) {
 15.1001 -			var val = fn(elems[i],i);
 15.1002 -
 15.1003 -			if ( val !== null && val != undefined ) {
 15.1004 -				if ( val.constructor != Array ) val = [val];
 15.1005 -				result = result.concat( val );
 15.1006 -			}
 15.1007 -		}
 15.1008 -
 15.1009 -		return result;
 15.1010 -	}
 15.1011 -});
 15.1012 -
 15.1013 -var userAgent = navigator.userAgent.toLowerCase();
 15.1014 -
 15.1015 -// Figure out what browser is being used
 15.1016 -jQuery.browser = {
 15.1017 -	version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
 15.1018 -	safari: /webkit/.test(userAgent),
 15.1019 -	opera: /opera/.test(userAgent),
 15.1020 -	msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
 15.1021 -	mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
 15.1022 -};
 15.1023 -
 15.1024 -var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 15.1025 -	
 15.1026 -jQuery.extend({
 15.1027 -	// Check to see if the W3C box model is being used
 15.1028 -	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 15.1029 -	
 15.1030 -	styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
 15.1031 -	
 15.1032 -	props: {
 15.1033 -		"for": "htmlFor",
 15.1034 -		"class": "className",
 15.1035 -		"float": styleFloat,
 15.1036 -		cssFloat: styleFloat,
 15.1037 -		styleFloat: styleFloat,
 15.1038 -		innerHTML: "innerHTML",
 15.1039 -		className: "className",
 15.1040 -		value: "value",
 15.1041 -		disabled: "disabled",
 15.1042 -		checked: "checked",
 15.1043 -		readonly: "readOnly",
 15.1044 -		selected: "selected",
 15.1045 -		maxlength: "maxLength"
 15.1046 -	}
 15.1047 -});
 15.1048 -
 15.1049 -jQuery.each({
 15.1050 -	parent: "a.parentNode",
 15.1051 -	parents: "jQuery.dir(a,'parentNode')",
 15.1052 -	next: "jQuery.nth(a,2,'nextSibling')",
 15.1053 -	prev: "jQuery.nth(a,2,'previousSibling')",
 15.1054 -	nextAll: "jQuery.dir(a,'nextSibling')",
 15.1055 -	prevAll: "jQuery.dir(a,'previousSibling')",
 15.1056 -	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
 15.1057 -	children: "jQuery.sibling(a.firstChild)",
 15.1058 -	contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
 15.1059 -}, function(i,n){
 15.1060 -	jQuery.fn[ i ] = function(a) {
 15.1061 -		var ret = jQuery.map(this,n);
 15.1062 -		if ( a && typeof a == "string" )
 15.1063 -			ret = jQuery.multiFilter(a,ret);
 15.1064 -		return this.pushStack( jQuery.unique(ret) );
 15.1065 -	};
 15.1066 -});
 15.1067 -
 15.1068 -jQuery.each({
 15.1069 -	appendTo: "append",
 15.1070 -	prependTo: "prepend",
 15.1071 -	insertBefore: "before",
 15.1072 -	insertAfter: "after",
 15.1073 -	replaceAll: "replaceWith"
 15.1074 -}, function(i,n){
 15.1075 -	jQuery.fn[ i ] = function(){
 15.1076 -		var a = arguments;
 15.1077 -		return this.each(function(){
 15.1078 -			for ( var j = 0, al = a.length; j < al; j++ )
 15.1079 -				jQuery(a[j])[n]( this );
 15.1080 -		});
 15.1081 -	};
 15.1082 -});
 15.1083 -
 15.1084 -jQuery.each( {
 15.1085 -	removeAttr: function( key ) {
 15.1086 -		jQuery.attr( this, key, "" );
 15.1087 -		this.removeAttribute( key );
 15.1088 -	},
 15.1089 -	addClass: function(c){
 15.1090 -		jQuery.className.add(this,c);
 15.1091 -	},
 15.1092 -	removeClass: function(c){
 15.1093 -		jQuery.className.remove(this,c);
 15.1094 -	},
 15.1095 -	toggleClass: function( c ){
 15.1096 -		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
 15.1097 -	},
 15.1098 -	remove: function(a){
 15.1099 -		if ( !a || jQuery.filter( a, [this] ).r.length ) {
 15.1100 -			jQuery.removeData( this );
 15.1101 -			this.parentNode.removeChild( this );
 15.1102 -		}
 15.1103 -	},
 15.1104 -	empty: function() {
 15.1105 -		// Clean up the cache
 15.1106 -		jQuery("*", this).each(function(){ jQuery.removeData(this); });
 15.1107 -
 15.1108 -		while ( this.firstChild )
 15.1109 -			this.removeChild( this.firstChild );
 15.1110 -	}
 15.1111 -}, function(i,n){
 15.1112 -	jQuery.fn[ i ] = function() {
 15.1113 -		return this.each( n, arguments );
 15.1114 -	};
 15.1115 -});
 15.1116 -
 15.1117 -jQuery.each( [ "Height", "Width" ], function(i,name){
 15.1118 -	var n = name.toLowerCase();
 15.1119 -	
 15.1120 -	jQuery.fn[ n ] = function(h) {
 15.1121 -		return this[0] == window ?
 15.1122 -			jQuery.browser.safari && self["inner" + name] ||
 15.1123 -			jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
 15.1124 -			document.body["client" + name] :
 15.1125 -		
 15.1126 -			this[0] == document ?
 15.1127 -				Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
 15.1128 -        
 15.1129 -				h == undefined ?
 15.1130 -					( this.length ? jQuery.css( this[0], n ) : null ) :
 15.1131 -					this.css( n, h.constructor == String ? h : h + "px" );
 15.1132 -	};
 15.1133 -});
 15.1134 -
 15.1135 -var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
 15.1136 -		"(?:[\\w*_-]|\\\\.)" :
 15.1137 -		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
 15.1138 -	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
 15.1139 -	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
 15.1140 -	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
 15.1141 -
 15.1142 -jQuery.extend({
 15.1143 -	expr: {
 15.1144 -		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
 15.1145 -		"#": "a.getAttribute('id')==m[2]",
 15.1146 -		":": {
 15.1147 -			// Position Checks
 15.1148 -			lt: "i<m[3]-0",
 15.1149 -			gt: "i>m[3]-0",
 15.1150 -			nth: "m[3]-0==i",
 15.1151 -			eq: "m[3]-0==i",
 15.1152 -			first: "i==0",
 15.1153 -			last: "i==r.length-1",
 15.1154 -			even: "i%2==0",
 15.1155 -			odd: "i%2",
 15.1156 -
 15.1157 -			// Child Checks
 15.1158 -			"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
 15.1159 -			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
 15.1160 -			"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
 15.1161 -
 15.1162 -			// Parent Checks
 15.1163 -			parent: "a.firstChild",
 15.1164 -			empty: "!a.firstChild",
 15.1165 -
 15.1166 -			// Text Check
 15.1167 -			contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
 15.1168 -
 15.1169 -			// Visibility
 15.1170 -			visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
 15.1171 -			hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
 15.1172 -
 15.1173 -			// Form attributes
 15.1174 -			enabled: "!a.disabled",
 15.1175 -			disabled: "a.disabled",
 15.1176 -			checked: "a.checked",
 15.1177 -			selected: "a.selected||jQuery.attr(a,'selected')",
 15.1178 -
 15.1179 -			// Form elements
 15.1180 -			text: "'text'==a.type",
 15.1181 -			radio: "'radio'==a.type",
 15.1182 -			checkbox: "'checkbox'==a.type",
 15.1183 -			file: "'file'==a.type",
 15.1184 -			password: "'password'==a.type",
 15.1185 -			submit: "'submit'==a.type",
 15.1186 -			image: "'image'==a.type",
 15.1187 -			reset: "'reset'==a.type",
 15.1188 -			button: '"button"==a.type||jQuery.nodeName(a,"button")',
 15.1189 -			input: "/input|select|textarea|button/i.test(a.nodeName)",
 15.1190 -
 15.1191 -			// :has()
 15.1192 -			has: "jQuery.find(m[3],a).length",
 15.1193 -
 15.1194 -			// :header
 15.1195 -			header: "/h\\d/i.test(a.nodeName)",
 15.1196 -
 15.1197 -			// :animated
 15.1198 -			animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
 15.1199 -		}
 15.1200 -	},
 15.1201 -	
 15.1202 -	// The regular expressions that power the parsing engine
 15.1203 -	parse: [
 15.1204 -		// Match: [@value='test'], [@foo]
 15.1205 -		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 15.1206 -
 15.1207 -		// Match: :contains('foo')
 15.1208 -		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 15.1209 -
 15.1210 -		// Match: :even, :last-chlid, #id, .class
 15.1211 -		new RegExp("^([:.#]*)(" + chars + "+)")
 15.1212 -	],
 15.1213 -
 15.1214 -	multiFilter: function( expr, elems, not ) {
 15.1215 -		var old, cur = [];
 15.1216 -
 15.1217 -		while ( expr && expr != old ) {
 15.1218 -			old = expr;
 15.1219 -			var f = jQuery.filter( expr, elems, not );
 15.1220 -			expr = f.t.replace(/^\s*,\s*/, "" );
 15.1221 -			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
 15.1222 -		}
 15.1223 -
 15.1224 -		return cur;
 15.1225 -	},
 15.1226 -
 15.1227 -	find: function( t, context ) {
 15.1228 -		// Quickly handle non-string expressions
 15.1229 -		if ( typeof t != "string" )
 15.1230 -			return [ t ];
 15.1231 -
 15.1232 -		// Make sure that the context is a DOM Element
 15.1233 -		if ( context && !context.nodeType )
 15.1234 -			context = null;
 15.1235 -
 15.1236 -		// Set the correct context (if none is provided)
 15.1237 -		context = context || document;
 15.1238 -
 15.1239 -		// Initialize the search
 15.1240 -		var ret = [context], done = [], last;
 15.1241 -
 15.1242 -		// Continue while a selector expression exists, and while
 15.1243 -		// we're no longer looping upon ourselves
 15.1244 -		while ( t && last != t ) {
 15.1245 -			var r = [];
 15.1246 -			last = t;
 15.1247 -
 15.1248 -			t = jQuery.trim(t);
 15.1249 -
 15.1250 -			var foundToken = false;
 15.1251 -
 15.1252 -			// An attempt at speeding up child selectors that
 15.1253 -			// point to a specific element tag
 15.1254 -			var re = quickChild;
 15.1255 -			var m = re.exec(t);
 15.1256 -
 15.1257 -			if ( m ) {
 15.1258 -				var nodeName = m[1].toUpperCase();
 15.1259 -
 15.1260 -				// Perform our own iteration and filter
 15.1261 -				for ( var i = 0; ret[i]; i++ )
 15.1262 -					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
 15.1263 -						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
 15.1264 -							r.push( c );
 15.1265 -
 15.1266 -				ret = r;
 15.1267 -				t = t.replace( re, "" );
 15.1268 -				if ( t.indexOf(" ") == 0 ) continue;
 15.1269 -				foundToken = true;
 15.1270 -			} else {
 15.1271 -				re = /^([>+~])\s*(\w*)/i;
 15.1272 -
 15.1273 -				if ( (m = re.exec(t)) != null ) {
 15.1274 -					r = [];
 15.1275 -
 15.1276 -					var nodeName = m[2], merge = {};
 15.1277 -					m = m[1];
 15.1278 -
 15.1279 -					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
 15.1280 -						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
 15.1281 -						for ( ; n; n = n.nextSibling )
 15.1282 -							if ( n.nodeType == 1 ) {
 15.1283 -								var id = jQuery.data(n);
 15.1284 -
 15.1285 -								if ( m == "~" && merge[id] ) break;
 15.1286 -								
 15.1287 -								if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
 15.1288 -									if ( m == "~" ) merge[id] = true;
 15.1289 -									r.push( n );
 15.1290 -								}
 15.1291 -								
 15.1292 -								if ( m == "+" ) break;
 15.1293 -							}
 15.1294 -					}
 15.1295 -
 15.1296 -					ret = r;
 15.1297 -
 15.1298 -					// And remove the token
 15.1299 -					t = jQuery.trim( t.replace( re, "" ) );
 15.1300 -					foundToken = true;
 15.1301 -				}
 15.1302 -			}
 15.1303 -
 15.1304 -			// See if there's still an expression, and that we haven't already
 15.1305 -			// matched a token
 15.1306 -			if ( t && !foundToken ) {
 15.1307 -				// Handle multiple expressions
 15.1308 -				if ( !t.indexOf(",") ) {
 15.1309 -					// Clean the result set
 15.1310 -					if ( context == ret[0] ) ret.shift();
 15.1311 -
 15.1312 -					// Merge the result sets
 15.1313 -					done = jQuery.merge( done, ret );
 15.1314 -
 15.1315 -					// Reset the context
 15.1316 -					r = ret = [context];
 15.1317 -
 15.1318 -					// Touch up the selector string
 15.1319 -					t = " " + t.substr(1,t.length);
 15.1320 -
 15.1321 -				} else {
 15.1322 -					// Optimize for the case nodeName#idName
 15.1323 -					var re2 = quickID;
 15.1324 -					var m = re2.exec(t);
 15.1325 -					
 15.1326 -					// Re-organize the results, so that they're consistent
 15.1327 -					if ( m ) {
 15.1328 -					   m = [ 0, m[2], m[3], m[1] ];
 15.1329 -
 15.1330 -					} else {
 15.1331 -						// Otherwise, do a traditional filter check for
 15.1332 -						// ID, class, and element selectors
 15.1333 -						re2 = quickClass;
 15.1334 -						m = re2.exec(t);
 15.1335 -					}
 15.1336 -
 15.1337 -					m[2] = m[2].replace(/\\/g, "");
 15.1338 -
 15.1339 -					var elem = ret[ret.length-1];
 15.1340 -
 15.1341 -					// Try to do a global search by ID, where we can
 15.1342 -					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 15.1343 -						// Optimization for HTML document case
 15.1344 -						var oid = elem.getElementById(m[2]);
 15.1345 -						
 15.1346 -						// Do a quick check for the existence of the actual ID attribute
 15.1347 -						// to avoid selecting by the name attribute in IE
 15.1348 -						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
 15.1349 -						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
 15.1350 -							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
 15.1351 -
 15.1352 -						// Do a quick check for node name (where applicable) so
 15.1353 -						// that div#foo searches will be really fast
 15.1354 -						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 15.1355 -					} else {
 15.1356 -						// We need to find all descendant elements
 15.1357 -						for ( var i = 0; ret[i]; i++ ) {
 15.1358 -							// Grab the tag name being searched for
 15.1359 -							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 15.1360 -
 15.1361 -							// Handle IE7 being really dumb about <object>s
 15.1362 -							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 15.1363 -								tag = "param";
 15.1364 -
 15.1365 -							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
 15.1366 -						}
 15.1367 -
 15.1368 -						// It's faster to filter by class and be done with it
 15.1369 -						if ( m[1] == "." )
 15.1370 -							r = jQuery.classFilter( r, m[2] );
 15.1371 -
 15.1372 -						// Same with ID filtering
 15.1373 -						if ( m[1] == "#" ) {
 15.1374 -							var tmp = [];
 15.1375 -
 15.1376 -							// Try to find the element with the ID
 15.1377 -							for ( var i = 0; r[i]; i++ )
 15.1378 -								if ( r[i].getAttribute("id") == m[2] ) {
 15.1379 -									tmp = [ r[i] ];
 15.1380 -									break;
 15.1381 -								}
 15.1382 -
 15.1383 -							r = tmp;
 15.1384 -						}
 15.1385 -
 15.1386 -						ret = r;
 15.1387 -					}
 15.1388 -
 15.1389 -					t = t.replace( re2, "" );
 15.1390 -				}
 15.1391 -
 15.1392 -			}
 15.1393 -
 15.1394 -			// If a selector string still exists
 15.1395 -			if ( t ) {
 15.1396 -				// Attempt to filter it
 15.1397 -				var val = jQuery.filter(t,r);
 15.1398 -				ret = r = val.r;
 15.1399 -				t = jQuery.trim(val.t);
 15.1400 -			}
 15.1401 -		}
 15.1402 -
 15.1403 -		// An error occurred with the selector;
 15.1404 -		// just return an empty set instead
 15.1405 -		if ( t )
 15.1406 -			ret = [];
 15.1407 -
 15.1408 -		// Remove the root context
 15.1409 -		if ( ret && context == ret[0] )
 15.1410 -			ret.shift();
 15.1411 -
 15.1412 -		// And combine the results
 15.1413 -		done = jQuery.merge( done, ret );
 15.1414 -
 15.1415 -		return done;
 15.1416 -	},
 15.1417 -
 15.1418 -	classFilter: function(r,m,not){
 15.1419 -		m = " " + m + " ";
 15.1420 -		var tmp = [];
 15.1421 -		for ( var i = 0; r[i]; i++ ) {
 15.1422 -			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
 15.1423 -			if ( !not && pass || not && !pass )
 15.1424 -				tmp.push( r[i] );
 15.1425 -		}
 15.1426 -		return tmp;
 15.1427 -	},
 15.1428 -
 15.1429 -	filter: function(t,r,not) {
 15.1430 -		var last;
 15.1431 -
 15.1432 -		// Look for common filter expressions
 15.1433 -		while ( t  && t != last ) {
 15.1434 -			last = t;
 15.1435 -
 15.1436 -			var p = jQuery.parse, m;
 15.1437 -
 15.1438 -			for ( var i = 0; p[i]; i++ ) {
 15.1439 -				m = p[i].exec( t );
 15.1440 -
 15.1441 -				if ( m ) {
 15.1442 -					// Remove what we just matched
 15.1443 -					t = t.substring( m[0].length );
 15.1444 -
 15.1445 -					m[2] = m[2].replace(/\\/g, "");
 15.1446 -					break;
 15.1447 -				}
 15.1448 -			}
 15.1449 -
 15.1450 -			if ( !m )
 15.1451 -				break;
 15.1452 -
 15.1453 -			// :not() is a special case that can be optimized by
 15.1454 -			// keeping it out of the expression list
 15.1455 -			if ( m[1] == ":" && m[2] == "not" )
 15.1456 -				r = jQuery.filter(m[3], r, true).r;
 15.1457 -
 15.1458 -			// We can get a big speed boost by filtering by class here
 15.1459 -			else if ( m[1] == "." )
 15.1460 -				r = jQuery.classFilter(r, m[2], not);
 15.1461 -
 15.1462 -			else if ( m[1] == "[" ) {
 15.1463 -				var tmp = [], type = m[3];
 15.1464 -				
 15.1465 -				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 15.1466 -					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
 15.1467 -					
 15.1468 -					if ( z == null || /href|src|selected/.test(m[2]) )
 15.1469 -						z = jQuery.attr(a,m[2]) || '';
 15.1470 -
 15.1471 -					if ( (type == "" && !!z ||
 15.1472 -						 type == "=" && z == m[5] ||
 15.1473 -						 type == "!=" && z != m[5] ||
 15.1474 -						 type == "^=" && z && !z.indexOf(m[5]) ||
 15.1475 -						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
 15.1476 -						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
 15.1477 -							tmp.push( a );
 15.1478 -				}
 15.1479 -				
 15.1480 -				r = tmp;
 15.1481 -
 15.1482 -			// We can get a speed boost by handling nth-child here
 15.1483 -			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
 15.1484 -				var merge = {}, tmp = [],
 15.1485 -					test = /(\d*)n\+?(\d*)/.exec(
 15.1486 -						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
 15.1487 -						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
 15.1488 -					first = (test[1] || 1) - 0, last = test[2] - 0;
 15.1489 -
 15.1490 -				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 15.1491 -					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
 15.1492 -
 15.1493 -					if ( !merge[id] ) {
 15.1494 -						var c = 1;
 15.1495 -
 15.1496 -						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
 15.1497 -							if ( n.nodeType == 1 )
 15.1498 -								n.nodeIndex = c++;
 15.1499 -
 15.1500 -						merge[id] = true;
 15.1501 -					}
 15.1502 -
 15.1503 -					var add = false;
 15.1504 -
 15.1505 -					if ( first == 1 ) {
 15.1506 -						if ( last == 0 || node.nodeIndex == last )
 15.1507 -							add = true;
 15.1508 -					} else if ( (node.nodeIndex + last) % first == 0 )
 15.1509 -						add = true;
 15.1510 -
 15.1511 -					if ( add ^ not )
 15.1512 -						tmp.push( node );
 15.1513 -				}
 15.1514 -
 15.1515 -				r = tmp;
 15.1516 -
 15.1517 -			// Otherwise, find the expression to execute
 15.1518 -			} else {
 15.1519 -				var f = jQuery.expr[m[1]];
 15.1520 -				if ( typeof f != "string" )
 15.1521 -					f = jQuery.expr[m[1]][m[2]];
 15.1522 -
 15.1523 -				// Build a custom macro to enclose it
 15.1524 -				f = eval("false||function(a,i){return " + f + "}");
 15.1525 -
 15.1526 -				// Execute it against the current filter
 15.1527 -				r = jQuery.grep( r, f, not );
 15.1528 -			}
 15.1529 -		}
 15.1530 -
 15.1531 -		// Return an array of filtered elements (r)
 15.1532 -		// and the modified expression string (t)
 15.1533 -		return { r: r, t: t };
 15.1534 -	},
 15.1535 -
 15.1536 -	dir: function( elem, dir ){
 15.1537 -		var matched = [];
 15.1538 -		var cur = elem[dir];
 15.1539 -		while ( cur && cur != document ) {
 15.1540 -			if ( cur.nodeType == 1 )
 15.1541 -				matched.push( cur );
 15.1542 -			cur = cur[dir];
 15.1543 -		}
 15.1544 -		return matched;
 15.1545 -	},
 15.1546 -	
 15.1547 -	nth: function(cur,result,dir,elem){
 15.1548 -		result = result || 1;
 15.1549 -		var num = 0;
 15.1550 -
 15.1551 -		for ( ; cur; cur = cur[dir] )
 15.1552 -			if ( cur.nodeType == 1 && ++num == result )
 15.1553 -				break;
 15.1554 -
 15.1555 -		return cur;
 15.1556 -	},
 15.1557 -	
 15.1558 -	sibling: function( n, elem ) {
 15.1559 -		var r = [];
 15.1560 -
 15.1561 -		for ( ; n; n = n.nextSibling ) {
 15.1562 -			if ( n.nodeType == 1 && (!elem || n != elem) )
 15.1563 -				r.push( n );
 15.1564 -		}
 15.1565 -
 15.1566 -		return r;
 15.1567 -	}
 15.1568 -});
 15.1569 -/*
 15.1570 - * A number of helper functions used for managing events.
 15.1571 - * Many of the ideas behind this code orignated from 
 15.1572 - * Dean Edwards' addEvent library.
 15.1573 - */
 15.1574 -jQuery.event = {
 15.1575 -
 15.1576 -	// Bind an event to an element
 15.1577 -	// Original by Dean Edwards
 15.1578 -	add: function(element, type, handler, data) {
 15.1579 -		// For whatever reason, IE has trouble passing the window object
 15.1580 -		// around, causing it to be cloned in the process
 15.1581 -		if ( jQuery.browser.msie && element.setInterval != undefined )
 15.1582 -			element = window;
 15.1583 -
 15.1584 -		// Make sure that the function being executed has a unique ID
 15.1585 -		if ( !handler.guid )
 15.1586 -			handler.guid = this.guid++;
 15.1587 -			
 15.1588 -		// if data is passed, bind to handler 
 15.1589 -		if( data != undefined ) { 
 15.1590 -        		// Create temporary function pointer to original handler 
 15.1591 -			var fn = handler; 
 15.1592 -
 15.1593 -			// Create unique handler function, wrapped around original handler 
 15.1594 -			handler = function() { 
 15.1595 -				// Pass arguments and context to original handler 
 15.1596 -				return fn.apply(this, arguments); 
 15.1597 -			};
 15.1598 -
 15.1599 -			// Store data in unique handler 
 15.1600 -			handler.data = data;
 15.1601 -
 15.1602 -			// Set the guid of unique handler to the same of original handler, so it can be removed 
 15.1603 -			handler.guid = fn.guid;
 15.1604 -		}
 15.1605 -
 15.1606 -		// Namespaced event handlers
 15.1607 -		var parts = type.split(".");
 15.1608 -		type = parts[0];
 15.1609 -		handler.type = parts[1];
 15.1610 -
 15.1611 -		// Init the element's event structure
 15.1612 -		var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
 15.1613 -		
 15.1614 -		var handle = jQuery.data(element, "handle", function(){
 15.1615 -			// returned undefined or false
 15.1616 -			var val;
 15.1617 -
 15.1618 -			// Handle the second event of a trigger and when
 15.1619 -			// an event is called after a page has unloaded
 15.1620 -			if ( typeof jQuery == "undefined" || jQuery.event.triggered )
 15.1621 -				return val;
 15.1622 -			
 15.1623 -			val = jQuery.event.handle.apply(element, arguments);
 15.1624 -			
 15.1625 -			return val;
 15.1626 -		});
 15.1627 -
 15.1628 -		// Get the current list of functions bound to this event
 15.1629 -		var handlers = events[type];
 15.1630 -
 15.1631 -		// Init the event handler queue
 15.1632 -		if (!handlers) {
 15.1633 -			handlers = events[type] = {};	
 15.1634 -			
 15.1635 -			// And bind the global event handler to the element
 15.1636 -			if (element.addEventListener)
 15.1637 -				element.addEventListener(type, handle, false);
 15.1638 -			else
 15.1639 -				element.attachEvent("on" + type, handle);
 15.1640 -		}
 15.1641 -
 15.1642 -		// Add the function to the element's handler list
 15.1643 -		handlers[handler.guid] = handler;
 15.1644 -
 15.1645 -		// Keep track of which events have been used, for global triggering
 15.1646 -		this.global[type] = true;
 15.1647 -	},
 15.1648 -
 15.1649 -	guid: 1,
 15.1650 -	global: {},
 15.1651 -
 15.1652 -	// Detach an event or set of events from an element
 15.1653 -	remove: function(element, type, handler) {
 15.1654 -		var events = jQuery.data(element, "events"), ret, index;
 15.1655 -
 15.1656 -		// Namespaced event handlers
 15.1657 -		if ( typeof type == "string" ) {
 15.1658 -			var parts = type.split(".");
 15.1659 -			type = parts[0];
 15.1660 -		}
 15.1661 -
 15.1662 -		if ( events ) {
 15.1663 -			// type is actually an event object here
 15.1664 -			if ( type && type.type ) {
 15.1665 -				handler = type.handler;
 15.1666 -				type = type.type;
 15.1667 -			}
 15.1668 -			
 15.1669 -			if ( !type ) {
 15.1670 -				for ( type in events )
 15.1671 -					this.remove( element, type );
 15.1672 -
 15.1673 -			} else if ( events[type] ) {
 15.1674 -				// remove the given handler for the given type
 15.1675 -				if ( handler )
 15.1676 -					delete events[type][handler.guid];
 15.1677 -				
 15.1678 -				// remove all handlers for the given type
 15.1679 -				else
 15.1680 -					for ( handler in events[type] )
 15.1681 -						// Handle the removal of namespaced events
 15.1682 -						if ( !parts[1] || events[type][handler].type == parts[1] )
 15.1683 -							delete events[type][handler];
 15.1684 -
 15.1685 -				// remove generic event handler if no more handlers exist
 15.1686 -				for ( ret in events[type] ) break;
 15.1687 -				if ( !ret ) {
 15.1688 -					if (element.removeEventListener)
 15.1689 -						element.removeEventListener(type, jQuery.data(element, "handle"), false);
 15.1690 -					else
 15.1691 -						element.detachEvent("on" + type, jQuery.data(element, "handle"));
 15.1692 -					ret = null;
 15.1693 -					delete events[type];
 15.1694 -				}
 15.1695 -			}
 15.1696 -
 15.1697 -			// Remove the expando if it's no longer used
 15.1698 -			for ( ret in events ) break;
 15.1699 -			if ( !ret ) {
 15.1700 -				jQuery.removeData( element, "events" );
 15.1701 -				jQuery.removeData( element, "handle" );
 15.1702 -			}
 15.1703 -		}
 15.1704 -	},
 15.1705 -
 15.1706 -	trigger: function(type, data, element, donative, extra) {
 15.1707 -		// Clone the incoming data, if any
 15.1708 -		data = jQuery.makeArray(data || []);
 15.1709 -
 15.1710 -		// Handle a global trigger
 15.1711 -		if ( !element ) {
 15.1712 -			// Only trigger if we've ever bound an event for it
 15.1713 -			if ( this.global[type] )
 15.1714 -				jQuery("*").add([window, document]).trigger(type, data);
 15.1715 -
 15.1716 -		// Handle triggering a single element
 15.1717 -		} else {
 15.1718 -			var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
 15.1719 -				// Check to see if we need to provide a fake event, or not
 15.1720 -				evt = !data[0] || !data[0].preventDefault;
 15.1721 -			
 15.1722 -			// Pass along a fake event
 15.1723 -			if ( evt )
 15.1724 -				data.unshift( this.fix({ type: type, target: element }) );
 15.1725 -
 15.1726 -			// Enforce the right trigger type
 15.1727 -			data[0].type = type;
 15.1728 -
 15.1729 -			// Trigger the event
 15.1730 -			if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
 15.1731 -				val = jQuery.data(element, "handle").apply( element, data );
 15.1732 -
 15.1733 -			// Handle triggering native .onfoo handlers
 15.1734 -			if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
 15.1735 -				val = false;
 15.1736 -
 15.1737 -			// Extra functions don't get the custom event object
 15.1738 -			if ( evt )
 15.1739 -				data.shift();
 15.1740 -
 15.1741 -			// Handle triggering of extra function
 15.1742 -			if ( extra && extra.apply( element, data ) === false )
 15.1743 -				val = false;
 15.1744 -
 15.1745 -			// Trigger the native events (except for clicks on links)
 15.1746 -			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
 15.1747 -				this.triggered = true;
 15.1748 -				element[ type ]();
 15.1749 -			}
 15.1750 -
 15.1751 -			this.triggered = false;
 15.1752 -		}
 15.1753 -
 15.1754 -		return val;
 15.1755 -	},
 15.1756 -
 15.1757 -	handle: function(event) {
 15.1758 -		// returned undefined or false
 15.1759 -		var val;
 15.1760 -
 15.1761 -		// Empty object is for triggered events with no data
 15.1762 -		event = jQuery.event.fix( event || window.event || {} ); 
 15.1763 -
 15.1764 -		// Namespaced event handlers
 15.1765 -		var parts = event.type.split(".");
 15.1766 -		event.type = parts[0];
 15.1767 -
 15.1768 -		var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
 15.1769 -		args.unshift( event );
 15.1770 -
 15.1771 -		for ( var j in c ) {
 15.1772 -			// Pass in a reference to the handler function itself
 15.1773 -			// So that we can later remove it
 15.1774 -			args[0].handler = c[j];
 15.1775 -			args[0].data = c[j].data;
 15.1776 -
 15.1777 -			// Filter the functions by class
 15.1778 -			if ( !parts[1] || c[j].type == parts[1] ) {
 15.1779 -				var tmp = c[j].apply( this, args );
 15.1780 -
 15.1781 -				if ( val !== false )
 15.1782 -					val = tmp;
 15.1783 -
 15.1784 -				if ( tmp === false ) {
 15.1785 -					event.preventDefault();
 15.1786 -					event.stopPropagation();
 15.1787 -				}
 15.1788 -			}
 15.1789 -		}
 15.1790 -
 15.1791 -		// Clean up added properties in IE to prevent memory leak
 15.1792 -		if (jQuery.browser.msie)
 15.1793 -			event.target = event.preventDefault = event.stopPropagation =
 15.1794 -				event.handler = event.data = null;
 15.1795 -
 15.1796 -		return val;
 15.1797 -	},
 15.1798 -
 15.1799 -	fix: function(event) {
 15.1800 -		// store a copy of the original event object 
 15.1801 -		// and clone to set read-only properties
 15.1802 -		var originalEvent = event;
 15.1803 -		event = jQuery.extend({}, originalEvent);
 15.1804 -		
 15.1805 -		// add preventDefault and stopPropagation since 
 15.1806 -		// they will not work on the clone
 15.1807 -		event.preventDefault = function() {
 15.1808 -			// if preventDefault exists run it on the original event
 15.1809 -			if (originalEvent.preventDefault)
 15.1810 -				originalEvent.preventDefault();
 15.1811 -			// otherwise set the returnValue property of the original event to false (IE)
 15.1812 -			originalEvent.returnValue = false;
 15.1813 -		};
 15.1814 -		event.stopPropagation = function() {
 15.1815 -			// if stopPropagation exists run it on the original event
 15.1816 -			if (originalEvent.stopPropagation)
 15.1817 -				originalEvent.stopPropagation();
 15.1818 -			// otherwise set the cancelBubble property of the original event to true (IE)
 15.1819 -			originalEvent.cancelBubble = true;
 15.1820 -		};
 15.1821 -		
 15.1822 -		// Fix target property, if necessary
 15.1823 -		if ( !event.target && event.srcElement )
 15.1824 -			event.target = event.srcElement;
 15.1825 -				
 15.1826 -		// check if target is a textnode (safari)
 15.1827 -		if (jQuery.browser.safari && event.target.nodeType == 3)
 15.1828 -			event.target = originalEvent.target.parentNode;
 15.1829 -
 15.1830 -		// Add relatedTarget, if necessary
 15.1831 -		if ( !event.relatedTarget && event.fromElement )
 15.1832 -			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
 15.1833 -
 15.1834 -		// Calculate pageX/Y if missing and clientX/Y available
 15.1835 -		if ( event.pageX == null && event.clientX != null ) {
 15.1836 -			var e = document.documentElement, b = document.body;
 15.1837 -			event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
 15.1838 -			event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
 15.1839 -		}
 15.1840 -			
 15.1841 -		// Add which for key events
 15.1842 -		if ( !event.which && (event.charCode || event.keyCode) )
 15.1843 -			event.which = event.charCode || event.keyCode;
 15.1844 -		
 15.1845 -		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 15.1846 -		if ( !event.metaKey && event.ctrlKey )
 15.1847 -			event.metaKey = event.ctrlKey;
 15.1848 -
 15.1849 -		// Add which for click: 1 == left; 2 == middle; 3 == right
 15.1850 -		// Note: button is not normalized, so don't use it
 15.1851 -		if ( !event.which && event.button )
 15.1852 -			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 15.1853 -			
 15.1854 -		return event;
 15.1855 -	}
 15.1856 -};
 15.1857 -
 15.1858 -jQuery.fn.extend({
 15.1859 -	bind: function( type, data, fn ) {
 15.1860 -		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
 15.1861 -			jQuery.event.add( this, type, fn || data, fn && data );
 15.1862 -		});
 15.1863 -	},
 15.1864 -	
 15.1865 -	one: function( type, data, fn ) {
 15.1866 -		return this.each(function(){
 15.1867 -			jQuery.event.add( this, type, function(event) {
 15.1868 -				jQuery(this).unbind(event);
 15.1869 -				return (fn || data).apply( this, arguments);
 15.1870 -			}, fn && data);
 15.1871 -		});
 15.1872 -	},
 15.1873 -
 15.1874 -	unbind: function( type, fn ) {
 15.1875 -		return this.each(function(){
 15.1876 -			jQuery.event.remove( this, type, fn );
 15.1877 -		});
 15.1878 -	},
 15.1879 -
 15.1880 -	trigger: function( type, data, fn ) {
 15.1881 -		return this.each(function(){
 15.1882 -			jQuery.event.trigger( type, data, this, true, fn );
 15.1883 -		});
 15.1884 -	},
 15.1885 -
 15.1886 -	triggerHandler: function( type, data, fn ) {
 15.1887 -		if ( this[0] )
 15.1888 -			return jQuery.event.trigger( type, data, this[0], false, fn );
 15.1889 -	},
 15.1890 -
 15.1891 -	toggle: function() {
 15.1892 -		// Save reference to arguments for access in closure
 15.1893 -		var a = arguments;
 15.1894 -
 15.1895 -		return this.click(function(e) {
 15.1896 -			// Figure out which function to execute
 15.1897 -			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
 15.1898 -			
 15.1899 -			// Make sure that clicks stop
 15.1900 -			e.preventDefault();
 15.1901 -			
 15.1902 -			// and execute the function
 15.1903 -			return a[this.lastToggle].apply( this, [e] ) || false;
 15.1904 -		});
 15.1905 -	},
 15.1906 -
 15.1907 -	hover: function(f,g) {
 15.1908 -		
 15.1909 -		// A private function for handling mouse 'hovering'
 15.1910 -		function handleHover(e) {
 15.1911 -			// Check if mouse(over|out) are still within the same parent element
 15.1912 -			var p = e.relatedTarget;
 15.1913 -	
 15.1914 -			// Traverse up the tree
 15.1915 -			while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
 15.1916 -			
 15.1917 -			// If we actually just moused on to a sub-element, ignore it
 15.1918 -			if ( p == this ) return false;
 15.1919 -			
 15.1920 -			// Execute the right function
 15.1921 -			return (e.type == "mouseover" ? f : g).apply(this, [e]);
 15.1922 -		}
 15.1923 -		
 15.1924 -		// Bind the function to the two event listeners
 15.1925 -		return this.mouseover(handleHover).mouseout(handleHover);
 15.1926 -	},
 15.1927 -	
 15.1928 -	ready: function(f) {
 15.1929 -		// Attach the listeners
 15.1930 -		bindReady();
 15.1931 -
 15.1932 -		// If the DOM is already ready
 15.1933 -		if ( jQuery.isReady )
 15.1934 -			// Execute the function immediately
 15.1935 -			f.apply( document, [jQuery] );
 15.1936 -			
 15.1937 -		// Otherwise, remember the function for later
 15.1938 -		else
 15.1939 -			// Add the function to the wait list
 15.1940 -			jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
 15.1941 -	
 15.1942 -		return this;
 15.1943 -	}
 15.1944 -});
 15.1945 -
 15.1946 -jQuery.extend({
 15.1947 -	/*
 15.1948 -	 * All the code that makes DOM Ready work nicely.
 15.1949 -	 */
 15.1950 -	isReady: false,
 15.1951 -	readyList: [],
 15.1952 -	
 15.1953 -	// Handle when the DOM is ready
 15.1954 -	ready: function() {
 15.1955 -		// Make sure that the DOM is not already loaded
 15.1956 -		if ( !jQuery.isReady ) {
 15.1957 -			// Remember that the DOM is ready
 15.1958 -			jQuery.isReady = true;
 15.1959 -			
 15.1960 -			// If there are functions bound, to execute
 15.1961 -			if ( jQuery.readyList ) {
 15.1962 -				// Execute all of them
 15.1963 -				jQuery.each( jQuery.readyList, function(){
 15.1964 -					this.apply( document );
 15.1965 -				});
 15.1966 -				
 15.1967 -				// Reset the list of functions
 15.1968 -				jQuery.readyList = null;
 15.1969 -			}
 15.1970 -			// Remove event listener to avoid memory leak
 15.1971 -			if ( jQuery.browser.mozilla || jQuery.browser.opera )
 15.1972 -				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
 15.1973 -			
 15.1974 -			// Remove script element used by IE hack
 15.1975 -			if( !window.frames.length ) // don't remove if frames are present (#1187)
 15.1976 -				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
 15.1977 -		}
 15.1978 -	}
 15.1979 -});
 15.1980 -
 15.1981 -jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
 15.1982 -	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
 15.1983 -	"submit,keydown,keypress,keyup,error").split(","), function(i,o){
 15.1984 -	
 15.1985 -	// Handle event binding
 15.1986 -	jQuery.fn[o] = function(f){
 15.1987 -		return f ? this.bind(o, f) : this.trigger(o);
 15.1988 -	};
 15.1989 -});
 15.1990 -
 15.1991 -var readyBound = false;
 15.1992 -
 15.1993 -function bindReady(){
 15.1994 -	if ( readyBound ) return;
 15.1995 -	readyBound = true;
 15.1996 -
 15.1997 -	// If Mozilla is used
 15.1998 -	if ( jQuery.browser.mozilla || jQuery.browser.opera )
 15.1999 -		// Use the handy event callback
 15.2000 -		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
 15.2001 -	
 15.2002 -	// If IE is used, use the excellent hack by Matthias Miller
 15.2003 -	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
 15.2004 -	else if ( jQuery.browser.msie ) {
 15.2005 -	
 15.2006 -		// Only works if you document.write() it
 15.2007 -		document.write("<scr" + "ipt id=__ie_init defer=true " + 
 15.2008 -			"src=//:><\/script>");
 15.2009 -	
 15.2010 -		// Use the defer script hack
 15.2011 -		var script = document.getElementById("__ie_init");
 15.2012 -		
 15.2013 -		// script does not exist if jQuery is loaded dynamically
 15.2014 -		if ( script ) 
 15.2015 -			script.onreadystatechange = function() {
 15.2016 -				if ( this.readyState != "complete" ) return;
 15.2017 -				jQuery.ready();
 15.2018 -			};
 15.2019 -	
 15.2020 -		// Clear from memory
 15.2021 -		script = null;
 15.2022 -	
 15.2023 -	// If Safari  is used
 15.2024 -	} else if ( jQuery.browser.safari )
 15.2025 -		// Continually check to see if the document.readyState is valid
 15.2026 -		jQuery.safariTimer = setInterval(function(){
 15.2027 -			// loaded and complete are both valid states
 15.2028 -			if ( document.readyState == "loaded" || 
 15.2029 -				document.readyState == "complete" ) {
 15.2030 -	
 15.2031 -				// If either one are found, remove the timer
 15.2032 -				clearInterval( jQuery.safariTimer );
 15.2033 -				jQuery.safariTimer = null;
 15.2034 -	
 15.2035 -				// and execute any waiting functions
 15.2036 -				jQuery.ready();
 15.2037 -			}
 15.2038 -		}, 10); 
 15.2039 -
 15.2040 -	// A fallback to window.onload, that will always work
 15.2041 -	jQuery.event.add( window, "load", jQuery.ready );
 15.2042 -}
 15.2043 -jQuery.fn.extend({
 15.2044 -	load: function( url, params, callback ) {
 15.2045 -		if ( jQuery.isFunction( url ) )
 15.2046 -			return this.bind("load", url);
 15.2047 -
 15.2048 -		var off = url.indexOf(" ");
 15.2049 -		if ( off >= 0 ) {
 15.2050 -			var selector = url.slice(off, url.length);
 15.2051 -			url = url.slice(0, off);
 15.2052 -		}
 15.2053 -
 15.2054 -		callback = callback || function(){};
 15.2055 -
 15.2056 -		// Default to a GET request
 15.2057 -		var type = "GET";
 15.2058 -
 15.2059 -		// If the second parameter was provided
 15.2060 -		if ( params )
 15.2061 -			// If it's a function
 15.2062 -			if ( jQuery.isFunction( params ) ) {
 15.2063 -				// We assume that it's the callback
 15.2064 -				callback = params;
 15.2065 -				params = null;
 15.2066 -
 15.2067 -			// Otherwise, build a param string
 15.2068 -			} else {
 15.2069 -				params = jQuery.param( params );
 15.2070 -				type = "POST";
 15.2071 -			}
 15.2072 -
 15.2073 -		var self = this;
 15.2074 -
 15.2075 -		// Request the remote document
 15.2076 -		jQuery.ajax({
 15.2077 -			url: url,
 15.2078 -			type: type,
 15.2079 -			data: params,
 15.2080 -			complete: function(res, status){
 15.2081 -				// If successful, inject the HTML into all the matched elements
 15.2082 -				if ( status == "success" || status == "notmodified" )
 15.2083 -					// See if a selector was specified
 15.2084 -					self.html( selector ?
 15.2085 -						// Create a dummy div to hold the results
 15.2086 -						jQuery("<div/>")
 15.2087 -							// inject the contents of the document in, removing the scripts
 15.2088 -							// to avoid any 'Permission Denied' errors in IE
 15.2089 -							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
 15.2090 -
 15.2091 -							// Locate the specified elements
 15.2092 -							.find(selector) :
 15.2093 -
 15.2094 -						// If not, just inject the full result
 15.2095 -						res.responseText );
 15.2096 -
 15.2097 -				// Add delay to account for Safari's delay in globalEval
 15.2098 -				setTimeout(function(){
 15.2099 -					self.each( callback, [res.responseText, status, res] );
 15.2100 -				}, 13);
 15.2101 -			}
 15.2102 -		});
 15.2103 -		return this;
 15.2104 -	},
 15.2105 -
 15.2106 -	serialize: function() {
 15.2107 -		return jQuery.param(this.serializeArray());
 15.2108 -	},
 15.2109 -	serializeArray: function() {
 15.2110 -		return this.map(function(){
 15.2111 -			return jQuery.nodeName(this, "form") ?
 15.2112 -				jQuery.makeArray(this.elements) : this;
 15.2113 -		})
 15.2114 -		.filter(function(){
 15.2115 -			return this.name && !this.disabled && 
 15.2116 -				(this.checked || /select|textarea/i.test(this.nodeName) || 
 15.2117 -					/text|hidden|password/i.test(this.type));
 15.2118 -		})
 15.2119 -		.map(function(i, elem){
 15.2120 -			var val = jQuery(this).val();
 15.2121 -			return val == null ? null :
 15.2122 -				val.constructor == Array ?
 15.2123 -					jQuery.map( val, function(val, i){
 15.2124 -						return {name: elem.name, value: val};
 15.2125 -					}) :
 15.2126 -					{name: elem.name, value: val};
 15.2127 -		}).get();
 15.2128 -	}
 15.2129 -});
 15.2130 -
 15.2131 -// Attach a bunch of functions for handling common AJAX events
 15.2132 -jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 15.2133 -	jQuery.fn[o] = function(f){
 15.2134 -		return this.bind(o, f);
 15.2135 -	};
 15.2136 -});
 15.2137 -
 15.2138 -var jsc = (new Date).getTime();
 15.2139 -
 15.2140 -jQuery.extend({
 15.2141 -	get: function( url, data, callback, type ) {
 15.2142 -		// shift arguments if data argument was ommited
 15.2143 -		if ( jQuery.isFunction( data ) ) {
 15.2144 -			callback = data;
 15.2145 -			data = null;
 15.2146 -		}
 15.2147 -		
 15.2148 -		return jQuery.ajax({
 15.2149 -			type: "GET",
 15.2150 -			url: url,
 15.2151 -			data: data,
 15.2152 -			success: callback,
 15.2153 -			dataType: type
 15.2154 -		});
 15.2155 -	},
 15.2156 -
 15.2157 -	getScript: function( url, callback ) {
 15.2158 -		return jQuery.get(url, null, callback, "script");
 15.2159 -	},
 15.2160 -
 15.2161 -	getJSON: function( url, data, callback ) {
 15.2162 -		return jQuery.get(url, data, callback, "json");
 15.2163 -	},
 15.2164 -
 15.2165 -	post: function( url, data, callback, type ) {
 15.2166 -		if ( jQuery.isFunction( data ) ) {
 15.2167 -			callback = data;
 15.2168 -			data = {};
 15.2169 -		}
 15.2170 -
 15.2171 -		return jQuery.ajax({
 15.2172 -			type: "POST",
 15.2173 -			url: url,
 15.2174 -			data: data,
 15.2175 -			success: callback,
 15.2176 -			dataType: type
 15.2177 -		});
 15.2178 -	},
 15.2179 -
 15.2180 -	ajaxSetup: function( settings ) {
 15.2181 -		jQuery.extend( jQuery.ajaxSettings, settings );
 15.2182 -	},
 15.2183 -
 15.2184 -	ajaxSettings: {
 15.2185 -		global: true,
 15.2186 -		type: "GET",
 15.2187 -		timeout: 0,
 15.2188 -		contentType: "application/x-www-form-urlencoded",
 15.2189 -		processData: true,
 15.2190 -		async: true,
 15.2191 -		data: null
 15.2192 -	},
 15.2193 -	
 15.2194 -	// Last-Modified header cache for next request
 15.2195 -	lastModified: {},
 15.2196 -
 15.2197 -	ajax: function( s ) {
 15.2198 -		var jsonp, jsre = /=(\?|%3F)/g, status, data;
 15.2199 -
 15.2200 -		// Extend the settings, but re-extend 's' so that it can be
 15.2201 -		// checked again later (in the test suite, specifically)
 15.2202 -		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 15.2203 -
 15.2204 -		// convert data if not already a string
 15.2205 -		if ( s.data && s.processData && typeof s.data != "string" )
 15.2206 -			s.data = jQuery.param(s.data);
 15.2207 -
 15.2208 -		// Handle JSONP Parameter Callbacks
 15.2209 -		if ( s.dataType == "jsonp" ) {
 15.2210 -			if ( s.type.toLowerCase() == "get" ) {
 15.2211 -				if ( !s.url.match(jsre) )
 15.2212 -					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
 15.2213 -			} else if ( !s.data || !s.data.match(jsre) )
 15.2214 -				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
 15.2215 -			s.dataType = "json";
 15.2216 -		}
 15.2217 -
 15.2218 -		// Build temporary JSONP function
 15.2219 -		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
 15.2220 -			jsonp = "jsonp" + jsc++;
 15.2221 -
 15.2222 -			// Replace the =? sequence both in the query string and the data
 15.2223 -			if ( s.data )
 15.2224 -				s.data = s.data.replace(jsre, "=" + jsonp);
 15.2225 -			s.url = s.url.replace(jsre, "=" + jsonp);
 15.2226 -
 15.2227 -			// We need to make sure
 15.2228 -			// that a JSONP style response is executed properly
 15.2229 -			s.dataType = "script";
 15.2230 -
 15.2231 -			// Handle JSONP-style loading
 15.2232 -			window[ jsonp ] = function(tmp){
 15.2233 -				data = tmp;
 15.2234 -				success();
 15.2235 -				complete();
 15.2236 -				// Garbage collect
 15.2237 -				window[ jsonp ] = undefined;
 15.2238 -				try{ delete window[ jsonp ]; } catch(e){}
 15.2239 -			};
 15.2240 -		}
 15.2241 -
 15.2242 -		if ( s.dataType == "script" && s.cache == null )
 15.2243 -			s.cache = false;
 15.2244 -
 15.2245 -		if ( s.cache === false && s.type.toLowerCase() == "get" )
 15.2246 -			s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
 15.2247 -
 15.2248 -		// If data is available, append data to url for get requests
 15.2249 -		if ( s.data && s.type.toLowerCase() == "get" ) {
 15.2250 -			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
 15.2251 -
 15.2252 -			// IE likes to send both get and post data, prevent this
 15.2253 -			s.data = null;
 15.2254 -		}
 15.2255 -
 15.2256 -		// Watch for a new set of requests
 15.2257 -		if ( s.global && ! jQuery.active++ )
 15.2258 -			jQuery.event.trigger( "ajaxStart" );
 15.2259 -
 15.2260 -		// If we're requesting a remote document
 15.2261 -		// and trying to load JSON or Script
 15.2262 -		if ( !s.url.indexOf("http") && s.dataType == "script" ) {
 15.2263 -			var head = document.getElementsByTagName("head")[0];
 15.2264 -			var script = document.createElement("script");
 15.2265 -			script.src = s.url;
 15.2266 -
 15.2267 -			// Handle Script loading
 15.2268 -			if ( !jsonp && (s.success || s.complete) ) {
 15.2269 -				var done = false;
 15.2270 -
 15.2271 -				// Attach handlers for all browsers
 15.2272 -				script.onload = script.onreadystatechange = function(){
 15.2273 -					if ( !done && (!this.readyState || 
 15.2274 -							this.readyState == "loaded" || this.readyState == "complete") ) {
 15.2275 -						done = true;
 15.2276 -						success();
 15.2277 -						complete();
 15.2278 -						head.removeChild( script );
 15.2279 -					}
 15.2280 -				};
 15.2281 -			}
 15.2282 -
 15.2283 -			head.appendChild(script);
 15.2284 -
 15.2285 -			// We handle everything using the script element injection
 15.2286 -			return;
 15.2287 -		}
 15.2288 -
 15.2289 -		var requestDone = false;
 15.2290 -
 15.2291 -		// Create the request object; Microsoft failed to properly
 15.2292 -		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
 15.2293 -		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 15.2294 -
 15.2295 -		// Open the socket
 15.2296 -		xml.open(s.type, s.url, s.async);
 15.2297 -
 15.2298 -		// Set the correct header, if data is being sent
 15.2299 -		if ( s.data )
 15.2300 -			xml.setRequestHeader("Content-Type", s.contentType);
 15.2301 -
 15.2302 -		// Set the If-Modified-Since header, if ifModified mode.
 15.2303 -		if ( s.ifModified )
 15.2304 -			xml.setRequestHeader("If-Modified-Since",
 15.2305 -				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 15.2306 -
 15.2307 -		// Set header so the called script knows that it's an XMLHttpRequest
 15.2308 -		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 15.2309 -
 15.2310 -		// Allow custom headers/mimetypes
 15.2311 -		if ( s.beforeSend )
 15.2312 -			s.beforeSend(xml);
 15.2313 -			
 15.2314 -		if ( s.global )
 15.2315 -		    jQuery.event.trigger("ajaxSend", [xml, s]);
 15.2316 -
 15.2317 -		// Wait for a response to come back
 15.2318 -		var onreadystatechange = function(isTimeout){
 15.2319 -			// The transfer is complete and the data is available, or the request timed out
 15.2320 -			if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
 15.2321 -				requestDone = true;
 15.2322 -				
 15.2323 -				// clear poll interval
 15.2324 -				if (ival) {
 15.2325 -					clearInterval(ival);
 15.2326 -					ival = null;
 15.2327 -				}
 15.2328 -				
 15.2329 -				status = isTimeout == "timeout" && "timeout" ||
 15.2330 -					!jQuery.httpSuccess( xml ) && "error" ||
 15.2331 -					s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
 15.2332 -					"success";
 15.2333 -
 15.2334 -				if ( status == "success" ) {
 15.2335 -					// Watch for, and catch, XML document parse errors
 15.2336 -					try {
 15.2337 -						// process the data (runs the xml through httpData regardless of callback)
 15.2338 -						data = jQuery.httpData( xml, s.dataType );
 15.2339 -					} catch(e) {
 15.2340 -						status = "parsererror";
 15.2341 -					}
 15.2342 -				}
 15.2343 -
 15.2344 -				// Make sure that the request was successful or notmodified
 15.2345 -				if ( status == "success" ) {
 15.2346 -					// Cache Last-Modified header, if ifModified mode.
 15.2347 -					var modRes;
 15.2348 -					try {
 15.2349 -						modRes = xml.getResponseHeader("Last-Modified");
 15.2350 -					} catch(e) {} // swallow exception thrown by FF if header is not available
 15.2351 -	
 15.2352 -					if ( s.ifModified && modRes )
 15.2353 -						jQuery.lastModified[s.url] = modRes;
 15.2354 -
 15.2355 -					// JSONP handles its own success callback
 15.2356 -					if ( !jsonp )
 15.2357 -						success();	
 15.2358 -				} else
 15.2359 -					jQuery.handleError(s, xml, status);
 15.2360 -
 15.2361 -				// Fire the complete handlers
 15.2362 -				complete();
 15.2363 -
 15.2364 -				// Stop memory leaks
 15.2365 -				if ( s.async )
 15.2366 -					xml = null;
 15.2367 -			}
 15.2368 -		};
 15.2369 -		
 15.2370 -		if ( s.async ) {
 15.2371 -			// don't attach the handler to the request, just poll it instead
 15.2372 -			var ival = setInterval(onreadystatechange, 13); 
 15.2373 -
 15.2374 -			// Timeout checker
 15.2375 -			if ( s.timeout > 0 )
 15.2376 -				setTimeout(function(){
 15.2377 -					// Check to see if the request is still happening
 15.2378 -					if ( xml ) {
 15.2379 -						// Cancel the request
 15.2380 -						xml.abort();
 15.2381 -	
 15.2382 -						if( !requestDone )
 15.2383 -							onreadystatechange( "timeout" );
 15.2384 -					}
 15.2385 -				}, s.timeout);
 15.2386 -		}
 15.2387 -			
 15.2388 -		// Send the data
 15.2389 -		try {
 15.2390 -			xml.send(s.data);
 15.2391 -		} catch(e) {
 15.2392 -			jQuery.handleError(s, xml, null, e);
 15.2393 -		}
 15.2394 -		
 15.2395 -		// firefox 1.5 doesn't fire statechange for sync requests
 15.2396 -		if ( !s.async )
 15.2397 -			onreadystatechange();
 15.2398 -		
 15.2399 -		// return XMLHttpRequest to allow aborting the request etc.
 15.2400 -		return xml;
 15.2401 -
 15.2402 -		function success(){
 15.2403 -			// If a local callback was specified, fire it and pass it the data
 15.2404 -			if ( s.success )
 15.2405 -				s.success( data, status );
 15.2406 -
 15.2407 -			// Fire the global callback
 15.2408 -			if ( s.global )
 15.2409 -				jQuery.event.trigger( "ajaxSuccess", [xml, s] );
 15.2410 -		}
 15.2411 -
 15.2412 -		function complete(){
 15.2413 -			// Process result
 15.2414 -			if ( s.complete )
 15.2415 -				s.complete(xml, status);
 15.2416 -
 15.2417 -			// The request was completed
 15.2418 -			if ( s.global )
 15.2419 -				jQuery.event.trigger( "ajaxComplete", [xml, s] );
 15.2420 -
 15.2421 -			// Handle the global AJAX counter
 15.2422 -			if ( s.global && ! --jQuery.active )
 15.2423 -				jQuery.event.trigger( "ajaxStop" );
 15.2424 -		}
 15.2425 -	},
 15.2426 -
 15.2427 -	handleError: function( s, xml, status, e ) {
 15.2428 -		// If a local callback was specified, fire it
 15.2429 -		if ( s.error ) s.error( xml, status, e );
 15.2430 -
 15.2431 -		// Fire the global callback
 15.2432 -		if ( s.global )
 15.2433 -			jQuery.event.trigger( "ajaxError", [xml, s, e] );
 15.2434 -	},
 15.2435 -
 15.2436 -	// Counter for holding the number of active queries
 15.2437 -	active: 0,
 15.2438 -
 15.2439 -	// Determines if an XMLHttpRequest was successful or not
 15.2440 -	httpSuccess: function( r ) {
 15.2441 -		try {
 15.2442 -			return !r.status && location.protocol == "file:" ||
 15.2443 -				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
 15.2444 -				jQuery.browser.safari && r.status == undefined;
 15.2445 -		} catch(e){}
 15.2446 -		return false;
 15.2447 -	},
 15.2448 -
 15.2449 -	// Determines if an XMLHttpRequest returns NotModified
 15.2450 -	httpNotModified: function( xml, url ) {
 15.2451 -		try {
 15.2452 -			var xmlRes = xml.getResponseHeader("Last-Modified");
 15.2453 -
 15.2454 -			// Firefox always returns 200. check Last-Modified date
 15.2455 -			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
 15.2456 -				jQuery.browser.safari && xml.status == undefined;
 15.2457 -		} catch(e){}
 15.2458 -		return false;
 15.2459 -	},
 15.2460 -
 15.2461 -	httpData: function( r, type ) {
 15.2462 -		var ct = r.getResponseHeader("content-type");
 15.2463 -		var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
 15.2464 -		var data = xml ? r.responseXML : r.responseText;
 15.2465 -
 15.2466 -		if ( xml && data.documentElement.tagName == "parsererror" )
 15.2467 -			throw "parsererror";
 15.2468 -
 15.2469 -		// If the type is "script", eval it in global context
 15.2470 -		if ( type == "script" )
 15.2471 -			jQuery.globalEval( data );
 15.2472 -
 15.2473 -		// Get the JavaScript object, if JSON is used.
 15.2474 -		if ( type == "json" )
 15.2475 -			data = eval("(" + data + ")");
 15.2476 -
 15.2477 -		return data;
 15.2478 -	},
 15.2479 -
 15.2480 -	// Serialize an array of form elements or a set of
 15.2481 -	// key/values into a query string
 15.2482 -	param: function( a ) {
 15.2483 -		var s = [];
 15.2484 -
 15.2485 -		// If an array was passed in, assume that it is an array
 15.2486 -		// of form elements
 15.2487 -		if ( a.constructor == Array || a.jquery )
 15.2488 -			// Serialize the form elements
 15.2489 -			jQuery.each( a, function(){
 15.2490 -				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
 15.2491 -			});
 15.2492 -
 15.2493 -		// Otherwise, assume that it's an object of key/value pairs
 15.2494 -		else
 15.2495 -			// Serialize the key/values
 15.2496 -			for ( var j in a )
 15.2497 -				// If the value is an array then the key names need to be repeated
 15.2498 -				if ( a[j] && a[j].constructor == Array )
 15.2499 -					jQuery.each( a[j], function(){
 15.2500 -						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 15.2501 -					});
 15.2502 -				else
 15.2503 -					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
 15.2504 -
 15.2505 -		// Return the resulting serialization
 15.2506 -		return s.join("&").replace(/%20/g, "+");
 15.2507 -	}
 15.2508 -
 15.2509 -});
 15.2510 -jQuery.fn.extend({
 15.2511 -	show: function(speed,callback){
 15.2512 -		return speed ?
 15.2513 -			this.animate({
 15.2514 -				height: "show", width: "show", opacity: "show"
 15.2515 -			}, speed, callback) :
 15.2516 -			
 15.2517 -			this.filter(":hidden").each(function(){
 15.2518 -				this.style.display = this.oldblock ? this.oldblock : "";
 15.2519 -				if ( jQuery.css(this,"display") == "none" )
 15.2520 -					this.style.display = "block";
 15.2521 -			}).end();
 15.2522 -	},
 15.2523 -	
 15.2524 -	hide: function(speed,callback){
 15.2525 -		return speed ?
 15.2526 -			this.animate({
 15.2527 -				height: "hide", width: "hide", opacity: "hide"
 15.2528 -			}, speed, callback) :
 15.2529 -			
 15.2530 -			this.filter(":visible").each(function(){
 15.2531 -				this.oldblock = this.oldblock || jQuery.css(this,"display");
 15.2532 -				if ( this.oldblock == "none" )
 15.2533 -					this.oldblock = "block";
 15.2534 -				this.style.display = "none";
 15.2535 -			}).end();
 15.2536 -	},
 15.2537 -
 15.2538 -	// Save the old toggle function
 15.2539 -	_toggle: jQuery.fn.toggle,
 15.2540 -	
 15.2541 -	toggle: function( fn, fn2 ){
 15.2542 -		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
 15.2543 -			this._toggle( fn, fn2 ) :
 15.2544 -			fn ?
 15.2545 -				this.animate({
 15.2546 -					height: "toggle", width: "toggle", opacity: "toggle"
 15.2547 -				}, fn, fn2) :
 15.2548 -				this.each(function(){
 15.2549 -					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
 15.2550 -				});
 15.2551 -	},
 15.2552 -	
 15.2553 -	slideDown: function(speed,callback){
 15.2554 -		return this.animate({height: "show"}, speed, callback);
 15.2555 -	},
 15.2556 -	
 15.2557 -	slideUp: function(speed,callback){
 15.2558 -		return this.animate({height: "hide"}, speed, callback);
 15.2559 -	},
 15.2560 -
 15.2561 -	slideToggle: function(speed, callback){
 15.2562 -		return this.animate({height: "toggle"}, speed, callback);
 15.2563 -	},
 15.2564 -	
 15.2565 -	fadeIn: function(speed, callback){
 15.2566 -		return this.animate({opacity: "show"}, speed, callback);
 15.2567 -	},
 15.2568 -	
 15.2569 -	fadeOut: function(speed, callback){
 15.2570 -		return this.animate({opacity: "hide"}, speed, callback);
 15.2571 -	},
 15.2572 -	
 15.2573 -	fadeTo: function(speed,to,callback){
 15.2574 -		return this.animate({opacity: to}, speed, callback);
 15.2575 -	},
 15.2576 -	
 15.2577 -	animate: function( prop, speed, easing, callback ) {
 15.2578 -		var opt = jQuery.speed(speed, easing, callback);
 15.2579 -
 15.2580 -		return this[ opt.queue === false ? "each" : "queue" ](function(){
 15.2581 -			opt = jQuery.extend({}, opt);
 15.2582 -			var hidden = jQuery(this).is(":hidden"), self = this;
 15.2583 -			
 15.2584 -			for ( var p in prop ) {
 15.2585 -				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
 15.2586 -					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
 15.2587 -
 15.2588 -				if ( p == "height" || p == "width" ) {
 15.2589 -					// Store display property
 15.2590 -					opt.display = jQuery.css(this, "display");
 15.2591 -
 15.2592 -					// Make sure that nothing sneaks out
 15.2593 -					opt.overflow = this.style.overflow;
 15.2594 -				}
 15.2595 -			}
 15.2596 -
 15.2597 -			if ( opt.overflow != null )
 15.2598 -				this.style.overflow = "hidden";
 15.2599 -
 15.2600 -			opt.curAnim = jQuery.extend({}, prop);
 15.2601 -			
 15.2602 -			jQuery.each( prop, function(name, val){
 15.2603 -				var e = new jQuery.fx( self, opt, name );
 15.2604 -
 15.2605 -				if ( /toggle|show|hide/.test(val) )
 15.2606 -					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 15.2607 -				else {
 15.2608 -					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
 15.2609 -						start = e.cur(true) || 0;
 15.2610 -
 15.2611 -					if ( parts ) {
 15.2612 -						var end = parseFloat(parts[2]),
 15.2613 -							unit = parts[3] || "px";
 15.2614 -
 15.2615 -						// We need to compute starting value
 15.2616 -						if ( unit != "px" ) {
 15.2617 -							self.style[ name ] = (end || 1) + unit;
 15.2618 -							start = ((end || 1) / e.cur(true)) * start;
 15.2619 -							self.style[ name ] = start + unit;
 15.2620 -						}
 15.2621 -
 15.2622 -						// If a +=/-= token was provided, we're doing a relative animation
 15.2623 -						if ( parts[1] )
 15.2624 -							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
 15.2625 -
 15.2626 -						e.custom( start, end, unit );
 15.2627 -					} else
 15.2628 -						e.custom( start, val, "" );
 15.2629 -				}
 15.2630 -			});
 15.2631 -
 15.2632 -			// For JS strict compliance
 15.2633 -			return true;
 15.2634 -		});
 15.2635 -	},
 15.2636 -	
 15.2637 -	queue: function(type, fn){
 15.2638 -		if ( jQuery.isFunction(type) ) {
 15.2639 -			fn = type;
 15.2640 -			type = "fx";
 15.2641 -		}
 15.2642 -
 15.2643 -		if ( !type || (typeof type == "string" && !fn) )
 15.2644 -			return queue( this[0], type );
 15.2645 -
 15.2646 -		return this.each(function(){
 15.2647 -			if ( fn.constructor == Array )
 15.2648 -				queue(this, type, fn);
 15.2649 -			else {
 15.2650 -				queue(this, type).push( fn );
 15.2651 -			
 15.2652 -				if ( queue(this, type).length == 1 )
 15.2653 -					fn.apply(this);
 15.2654 -			}
 15.2655 -		});
 15.2656 -	},
 15.2657 -
 15.2658 -	stop: function(){
 15.2659 -		var timers = jQuery.timers;
 15.2660 -
 15.2661 -		return this.each(function(){
 15.2662 -			for ( var i = 0; i < timers.length; i++ )
 15.2663 -				if ( timers[i].elem == this )
 15.2664 -					timers.splice(i--, 1);
 15.2665 -		}).dequeue();
 15.2666 -	}
 15.2667 -
 15.2668 -});
 15.2669 -
 15.2670 -var queue = function( elem, type, array ) {
 15.2671 -	if ( !elem )
 15.2672 -		return;
 15.2673 -
 15.2674 -	var q = jQuery.data( elem, type + "queue" );
 15.2675 -
 15.2676 -	if ( !q || array )
 15.2677 -		q = jQuery.data( elem, type + "queue", 
 15.2678 -			array ? jQuery.makeArray(array) : [] );
 15.2679 -
 15.2680 -	return q;
 15.2681 -};
 15.2682 -
 15.2683 -jQuery.fn.dequeue = function(type){
 15.2684 -	type = type || "fx";
 15.2685 -
 15.2686 -	return this.each(function(){
 15.2687 -		var q = queue(this, type);
 15.2688 -
 15.2689 -		q.shift();
 15.2690 -
 15.2691 -		if ( q.length )
 15.2692 -			q[0].apply( this );
 15.2693 -	});
 15.2694 -};
 15.2695 -
 15.2696 -jQuery.extend({
 15.2697 -	
 15.2698 -	speed: function(speed, easing, fn) {
 15.2699 -		var opt = speed && speed.constructor == Object ? speed : {
 15.2700 -			complete: fn || !fn && easing || 
 15.2701 -				jQuery.isFunction( speed ) && speed,
 15.2702 -			duration: speed,
 15.2703 -			easing: fn && easing || easing && easing.constructor != Function && easing
 15.2704 -		};
 15.2705 -
 15.2706 -		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
 15.2707 -			opt.duration : 
 15.2708 -			{ slow: 600, fast: 200 }[opt.duration]) || 400;
 15.2709 -	
 15.2710 -		// Queueing
 15.2711 -		opt.old = opt.complete;
 15.2712 -		opt.complete = function(){
 15.2713 -			jQuery(this).dequeue();
 15.2714 -			if ( jQuery.isFunction( opt.old ) )
 15.2715 -				opt.old.apply( this );
 15.2716 -		};
 15.2717 -	
 15.2718 -		return opt;
 15.2719 -	},
 15.2720 -	
 15.2721 -	easing: {
 15.2722 -		linear: function( p, n, firstNum, diff ) {
 15.2723 -			return firstNum + diff * p;
 15.2724 -		},
 15.2725 -		swing: function( p, n, firstNum, diff ) {
 15.2726 -			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 15.2727 -		}
 15.2728 -	},
 15.2729 -	
 15.2730 -	timers: [],
 15.2731 -
 15.2732 -	fx: function( elem, options, prop ){
 15.2733 -		this.options = options;
 15.2734 -		this.elem = elem;
 15.2735 -		this.prop = prop;
 15.2736 -
 15.2737 -		if ( !options.orig )
 15.2738 -			options.orig = {};
 15.2739 -	}
 15.2740 -
 15.2741 -});
 15.2742 -
 15.2743 -jQuery.fx.prototype = {
 15.2744 -
 15.2745 -	// Simple function for setting a style value
 15.2746 -	update: function(){
 15.2747 -		if ( this.options.step )
 15.2748 -			this.options.step.apply( this.elem, [ this.now, this ] );
 15.2749 -
 15.2750 -		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 15.2751 -
 15.2752 -		// Set display property to block for height/width animations
 15.2753 -		if ( this.prop == "height" || this.prop == "width" )
 15.2754 -			this.elem.style.display = "block";
 15.2755 -	},
 15.2756 -
 15.2757 -	// Get the current size
 15.2758 -	cur: function(force){
 15.2759 -		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
 15.2760 -			return this.elem[ this.prop ];
 15.2761 -
 15.2762 -		var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
 15.2763 -		return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
 15.2764 -	},
 15.2765 -
 15.2766 -	// Start an animation from one number to another
 15.2767 -	custom: function(from, to, unit){
 15.2768 -		this.startTime = (new Date()).getTime();
 15.2769 -		this.start = from;
 15.2770 -		this.end = to;
 15.2771 -		this.unit = unit || this.unit || "px";
 15.2772 -		this.now = this.start;
 15.2773 -		this.pos = this.state = 0;
 15.2774 -		this.update();
 15.2775 -
 15.2776 -		var self = this;
 15.2777 -		function t(){
 15.2778 -			return self.step();
 15.2779 -		}
 15.2780 -
 15.2781 -		t.elem = this.elem;
 15.2782 -
 15.2783 -		jQuery.timers.push(t);
 15.2784 -
 15.2785 -		if ( jQuery.timers.length == 1 ) {
 15.2786 -			var timer = setInterval(function(){
 15.2787 -				var timers = jQuery.timers;
 15.2788 -				
 15.2789 -				for ( var i = 0; i < timers.length; i++ )
 15.2790 -					if ( !timers[i]() )
 15.2791 -						timers.splice(i--, 1);
 15.2792 -
 15.2793 -				if ( !timers.length )
 15.2794 -					clearInterval( timer );
 15.2795 -			}, 13);
 15.2796 -		}
 15.2797 -	},
 15.2798 -
 15.2799 -	// Simple 'show' function
 15.2800 -	show: function(){
 15.2801 -		// Remember where we started, so that we can go back to it later
 15.2802 -		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 15.2803 -		this.options.show = true;
 15.2804 -
 15.2805 -		// Begin the animation
 15.2806 -		this.custom(0, this.cur());
 15.2807 -
 15.2808 -		// Make sure that we start at a small width/height to avoid any
 15.2809 -		// flash of content
 15.2810 -		if ( this.prop == "width" || this.prop == "height" )
 15.2811 -			this.elem.style[this.prop] = "1px";
 15.2812 -		
 15.2813 -		// Start by showing the element
 15.2814 -		jQuery(this.elem).show();
 15.2815 -	},
 15.2816 -
 15.2817 -	// Simple 'hide' function
 15.2818 -	hide: function(){
 15.2819 -		// Remember where we started, so that we can go back to it later
 15.2820 -		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 15.2821 -		this.options.hide = true;
 15.2822 -
 15.2823 -		// Begin the animation
 15.2824 -		this.custom(this.cur(), 0);
 15.2825 -	},
 15.2826 -
 15.2827 -	// Each step of an animation
 15.2828 -	step: function(){
 15.2829 -		var t = (new Date()).getTime();
 15.2830 -
 15.2831 -		if ( t > this.options.duration + this.startTime ) {
 15.2832 -			this.now = this.end;
 15.2833 -			this.pos = this.state = 1;
 15.2834 -			this.update();
 15.2835 -
 15.2836 -			this.options.curAnim[ this.prop ] = true;
 15.2837 -
 15.2838 -			var done = true;
 15.2839 -			for ( var i in this.options.curAnim )
 15.2840 -				if ( this.options.curAnim[i] !== true )
 15.2841 -					done = false;
 15.2842 -
 15.2843 -			if ( done ) {
 15.2844 -				if ( this.options.display != null ) {
 15.2845 -					// Reset the overflow
 15.2846 -					this.elem.style.overflow = this.options.overflow;
 15.2847 -				
 15.2848 -					// Reset the display
 15.2849 -					this.elem.style.display = this.options.display;
 15.2850 -					if ( jQuery.css(this.elem, "display") == "none" )
 15.2851 -						this.elem.style.display = "block";
 15.2852 -				}
 15.2853 -
 15.2854 -				// Hide the element if the "hide" operation was done
 15.2855 -				if ( this.options.hide )
 15.2856 -					this.elem.style.display = "none";
 15.2857 -
 15.2858 -				// Reset the properties, if the item has been hidden or shown
 15.2859 -				if ( this.options.hide || this.options.show )
 15.2860 -					for ( var p in this.options.curAnim )
 15.2861 -						jQuery.attr(this.elem.style, p, this.options.orig[p]);
 15.2862 -			}
 15.2863 -
 15.2864 -			// If a callback was provided, execute it
 15.2865 -			if ( done && jQuery.isFunction( this.options.complete ) )
 15.2866 -				// Execute the complete function
 15.2867 -				this.options.complete.apply( this.elem );
 15.2868 -
 15.2869 -			return false;
 15.2870 -		} else {
 15.2871 -			var n = t - this.startTime;
 15.2872 -			this.state = n / this.options.duration;
 15.2873 -
 15.2874 -			// Perform the easing function, defaults to swing
 15.2875 -			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
 15.2876 -			this.now = this.start + ((this.end - this.start) * this.pos);
 15.2877 -
 15.2878 -			// Perform the next step of the animation
 15.2879 -			this.update();
 15.2880 -		}
 15.2881 -
 15.2882 -		return true;
 15.2883 -	}
 15.2884 -
 15.2885 -};
 15.2886 -
 15.2887 -jQuery.fx.step = {
 15.2888 -	scrollLeft: function(fx){
 15.2889 -		fx.elem.scrollLeft = fx.now;
 15.2890 -	},
 15.2891 -
 15.2892 -	scrollTop: function(fx){
 15.2893 -		fx.elem.scrollTop = fx.now;
 15.2894 -	},
 15.2895 -
 15.2896 -	opacity: function(fx){
 15.2897 -		jQuery.attr(fx.elem.style, "opacity", fx.now);
 15.2898 -	},
 15.2899 -
 15.2900 -	_default: function(fx){
 15.2901 -		fx.elem.style[ fx.prop ] = fx.now + fx.unit;
 15.2902 -	}
 15.2903 -};
 15.2904 -// The Offset Method
 15.2905 -// Originally By Brandon Aaron, part of the Dimension Plugin
 15.2906 -// http://jquery.com/plugins/project/dimensions
 15.2907 -jQuery.fn.offset = function() {
 15.2908 -	var left = 0, top = 0, elem = this[0], results;
 15.2909 -	
 15.2910 -	if ( elem ) with ( jQuery.browser ) {
 15.2911 -		var	absolute     = jQuery.css(elem, "position") == "absolute", 
 15.2912 -		    parent       = elem.parentNode, 
 15.2913 -		    offsetParent = elem.offsetParent, 
 15.2914 -		    doc          = elem.ownerDocument,
 15.2915 -		    safari2      = safari && parseInt(version) < 522;
 15.2916 -	
 15.2917 -		// Use getBoundingClientRect if available
 15.2918 -		if ( elem.getBoundingClientRect ) {
 15.2919 -			box = elem.getBoundingClientRect();
 15.2920 -		
 15.2921 -			// Add the document scroll offsets
 15.2922 -			add(
 15.2923 -				box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 15.2924 -				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop)
 15.2925 -			);
 15.2926 -		
 15.2927 -			// IE adds the HTML element's border, by default it is medium which is 2px
 15.2928 -			// IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; }
 15.2929 -			// IE 7 standards mode, the border is always 2px
 15.2930 -			if ( msie ) {
 15.2931 -				var border = jQuery("html").css("borderWidth");
 15.2932 -				border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
 15.2933 -				add( -border, -border );
 15.2934 -			}
 15.2935 -	
 15.2936 -		// Otherwise loop through the offsetParents and parentNodes
 15.2937 -		} else {
 15.2938 -		
 15.2939 -			// Initial element offsets
 15.2940 -			add( elem.offsetLeft, elem.offsetTop );
 15.2941 -		
 15.2942 -			// Get parent offsets
 15.2943 -			while ( offsetParent ) {
 15.2944 -				// Add offsetParent offsets
 15.2945 -				add( offsetParent.offsetLeft, offsetParent.offsetTop );
 15.2946 -			
 15.2947 -				// Mozilla and Safari > 2 does not include the border on offset parents
 15.2948 -				// However Mozilla adds the border for table cells
 15.2949 -				if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
 15.2950 -					border( offsetParent );
 15.2951 -				
 15.2952 -				// Safari <= 2 doubles body offsets with an absolutely positioned element or parent
 15.2953 -				if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
 15.2954 -					absolute = true;
 15.2955 -			
 15.2956 -				// Get next offsetParent
 15.2957 -				offsetParent = offsetParent.offsetParent;
 15.2958 -			}
 15.2959 -		
 15.2960 -			// Get parent scroll offsets
 15.2961 -			while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
 15.2962 -				// Work around opera inline/table scrollLeft/Top bug
 15.2963 -				if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
 15.2964 -					// Subtract parent scroll offsets
 15.2965 -					add( -parent.scrollLeft, -parent.scrollTop );
 15.2966 -			
 15.2967 -				// Mozilla does not add the border for a parent that has overflow != visible
 15.2968 -				if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
 15.2969 -					border( parent );
 15.2970 -			
 15.2971 -				// Get next parent
 15.2972 -				parent = parent.parentNode;
 15.2973 -			}
 15.2974 -		
 15.2975 -			// Safari doubles body offsets with an absolutely positioned element or parent
 15.2976 -			if ( safari2 && absolute )
 15.2977 -				add( -doc.body.offsetLeft, -doc.body.offsetTop );
 15.2978 -		}
 15.2979 -
 15.2980 -		// Return an object with top and left properties
 15.2981 -		results = { top: top, left: left };
 15.2982 -	}
 15.2983 -
 15.2984 -	return results;
 15.2985 -
 15.2986 -	function border(elem) {
 15.2987 -		add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
 15.2988 -	}
 15.2989 -
 15.2990 -	function add(l, t) {
 15.2991 -		left += parseInt(l) || 0;
 15.2992 -		top += parseInt(t) || 0;
 15.2993 -	}
 15.2994 -};
 15.2995 -})();
    16.1 --- a/web/styles/styles.css	Mon Oct 26 14:12:27 2009 +0100
    16.2 +++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.3 @@ -1,286 +0,0 @@
    16.4 -body {
    16.5 -  background: #F2F1F0;
    16.6 -  font-family: verdana,sans-serif;
    16.7 -}
    16.8 -
    16.9 -.navheader, .book, .preface, .chapter, .appendix, .bibliography, .navfooter, .basetemplate {
   16.10 -  width: 50em;
   16.11 -  margin-left: auto;
   16.12 -  margin-right: auto;
   16.13 -}
   16.14 -
   16.15 -a.commenttoggle:hover, a.commenttoggle:active {
   16.16 -  opacity: 0.7;
   16.17 -}
   16.18 -
   16.19 -a:hover, a:active {
   16.20 -  border-bottom: 1px solid #aaaaaa;
   16.21 -}
   16.22 -
   16.23 -.book, .preface, .chapter, .appendix, .bibliography, .basetemplate {
   16.24 -  background: white;
   16.25 -  padding: 2em;
   16.26 -}
   16.27 -
   16.28 -h1 {
   16.29 -  margin-top: 1.5em;
   16.30 -}
   16.31 -
   16.32 -span.beta {
   16.33 -  font-size: 80%;
   16.34 -  font-style: italic;
   16.35 -  opacity: 0.4;
   16.36 -}
   16.37 -
   16.38 -h2, h3 {
   16.39 -  margin-top: 2em;
   16.40 -}
   16.41 -
   16.42 -h1, h2, h3 {
   16.43 -  font-family: georgia,serif;
   16.44 -  font-weight: normal;
   16.45 -  margin-bottom: 0.5em;
   16.46 -}
   16.47 -
   16.48 -h1.booktitle {
   16.49 -  margin-bottom: 0px;
   16.50 -}
   16.51 -
   16.52 -h2.booktitle {
   16.53 -  text-align: center;
   16.54 -}
   16.55 -
   16.56 -h2.booktitle > a {
   16.57 -  color: black;
   16.58 -}
   16.59 -
   16.60 -.authors {
   16.61 -  font-size: 80%;
   16.62 -  opacity: 0.55;
   16.63 -  padding-left: 0.5em;
   16.64 -}
   16.65 -
   16.66 -div.note th, div.tip th, div.warning th {
   16.67 -  font-family: georgia,serif;
   16.68 -  font-weight: normal;
   16.69 -  font-size: 110%;
   16.70 -}
   16.71 -
   16.72 -div.navheader th, div.navfooter td {
   16.73 -  font-family: georgia,serif;
   16.74 -}
   16.75 -
   16.76 -div.navheader th {
   16.77 -  opacity: 0;
   16.78 -  font-size: 0;
   16.79 -}
   16.80 -
   16.81 -pre.screen {
   16.82 -  background-image: url(figs/shell.png);
   16.83 -}
   16.84 -
   16.85 -pre.programlisting {
   16.86 -  background-image: url(figs/source.png);
   16.87 -}
   16.88 -
   16.89 -pre.programlisting, pre.screen, p.remark {
   16.90 -  border-style: solid;
   16.91 -  border-width: 1px;
   16.92 -  font-size: medium;
   16.93 -  padding: 1em;
   16.94 -  background-repeat: no-repeat;
   16.95 -  background-position: 10px 10px;
   16.96 -  padding-left: 70px;
   16.97 -}
   16.98 -
   16.99 -strong.command, code, pre, span.type {
  16.100 -  font-family: monospace;
  16.101 -  font-weight: normal;
  16.102 -}
  16.103 -
  16.104 -strong.userinput > code {
  16.105 -  font-weight: bolder;
  16.106 -  color: #303030;
  16.107 -}
  16.108 -
  16.109 -div.toc > p {
  16.110 -  opacity: 0.35;
  16.111 -  font-family: georgia,serif;
  16.112 -  cursor: pointer;
  16.113 -}
  16.114 -
  16.115 -div.toc b {
  16.116 -  font-weight: normal;
  16.117 -  font-size: large;
  16.118 -}
  16.119 -
  16.120 -ul.booktoc {
  16.121 -  padding-left: 0px;
  16.122 -  list-style-type: none;
  16.123 -}
  16.124 -
  16.125 -.booktoc > li {
  16.126 -  padding: 0.5em;
  16.127 -}
  16.128 -
  16.129 -.chapinfo {
  16.130 -  float: right;
  16.131 -  color: #a0a0a0;
  16.132 -}
  16.133 -
  16.134 -.unpublished {
  16.135 -  color: #a0a0a0;
  16.136 -}
  16.137 -
  16.138 -.chapinfo img {
  16.139 -  vertical-align: -35%;
  16.140 -  border: 0px;
  16.141 -}
  16.142 -
  16.143 -.zebra_b {
  16.144 -  background: #f4f4f4;
  16.145 -}
  16.146 -
  16.147 -.book .titlepage {
  16.148 -  display: none;
  16.149 -}
  16.150 -
  16.151 -.chapter div.toc > dl {
  16.152 -  display: none;
  16.153 -}
  16.154 -
  16.155 -pre.programlisting, pre.screen, p.remark {
  16.156 -  overflow: hidden;
  16.157 -}
  16.158 -
  16.159 -p.remark {
  16.160 -  background-image: url(figs/remark.png);
  16.161 -}
  16.162 -
  16.163 -div.warning, p.remark {
  16.164 -  background-color: #FFEFE8;
  16.165 -  border-color: #e0a8a0;
  16.166 -}
  16.167 -
  16.168 -span.remark {
  16.169 -  font-style: normal;
  16.170 -  color: #707070;
  16.171 -}
  16.172 -
  16.173 -.screen {
  16.174 -  background: #e7ffc7 none repeat scroll 0% 50%;
  16.175 -  border-color: #94DA3A;
  16.176 -}
  16.177 -
  16.178 -.programlisting {
  16.179 -  background: #F0F4FF none repeat scroll 0% 50%;
  16.180 -  border-color: #B4BAEA;
  16.181 -}
  16.182 -
  16.183 -.prompt {
  16.184 -  color: #448844;
  16.185 -}
  16.186 -
  16.187 -div.note, div.tip {
  16.188 -  background: #ffffc9;
  16.189 -  border-color: #B4BAEA;
  16.190 -}
  16.191 -
  16.192 -div.note, div.warning, div.tip {
  16.193 -  border-style: solid;
  16.194 -  border-width: 1px;
  16.195 -  padding: 1em;
  16.196 -}
  16.197 -
  16.198 -.note .title {
  16.199 -  font-size: 90%;
  16.200 -}
  16.201 -
  16.202 -.comment {
  16.203 -  font-size: 80%;
  16.204 -}
  16.205 -
  16.206 -div.comment, div.new_comment {
  16.207 -  padding: 0.5em;
  16.208 -  margin: 0.5em;
  16.209 -  margin-left: 2em;
  16.210 -  border-style: solid;
  16.211 -  border-width: 1px;
  16.212 -  border-color: #aaaaff;
  16.213 -}
  16.214 -
  16.215 -div.comment {
  16.216 -  background: #eeeeff;
  16.217 -}
  16.218 -
  16.219 -div.new_comment {
  16.220 -  background: #d0d0ff;
  16.221 -}
  16.222 -
  16.223 -.commenttoggle {
  16.224 -  opacity: 0.35;
  16.225 -}
  16.226 -
  16.227 -.comment_help {
  16.228 -  font-size: 80%;
  16.229 -}
  16.230 -
  16.231 -.comment_header {
  16.232 -  opacity: 0.75;
  16.233 -}
  16.234 -
  16.235 -.comment_id {
  16.236 -  float: right;
  16.237 -  opacity: 0.3;
  16.238 -  font-size: 60%;
  16.239 -}
  16.240 -
  16.241 -.comment_name {
  16.242 -  font-weight: bolder;
  16.243 -}
  16.244 -
  16.245 -.comment_reviewed {
  16.246 -  color: darkgreen;
  16.247 -  margin-left: 1em;
  16.248 -  font-style: italic;
  16.249 -}
  16.250 -
  16.251 -.comment_date {
  16.252 -  opacity: 0.75;
  16.253 -}
  16.254 -
  16.255 -.comment_thanks {
  16.256 -  color: darkblue;
  16.257 -  margin-left: 1em;
  16.258 -  font-style: italic;
  16.259 -  font-weight: bolder;
  16.260 -}
  16.261 -
  16.262 -.comment_error {
  16.263 -  padding-left: 1em;
  16.264 -  font-weight: bolder;
  16.265 -  font-size: 80%;
  16.266 -  color: darkred;
  16.267 -}
  16.268 -
  16.269 -.hgfooter {
  16.270 -  width: 60em;
  16.271 -  margin-left: auto;
  16.272 -  margin-right: auto;
  16.273 -  margin-top: 2em;
  16.274 -  margin-bottom: 2em;
  16.275 -  font-size: 80%;
  16.276 -  color: #727272;
  16.277 -}
  16.278 -
  16.279 -.hgfooter a {
  16.280 -  color: #5555ff;
  16.281 -}
  16.282 -
  16.283 -.hgfooter a:visited {
  16.284 -  opacity: 0.7;
  16.285 -}
  16.286 -
  16.287 -.hgfooter img {
  16.288 -  vertical-align: -45%;
  16.289 -}
    17.1 Binary file web/support/icons/caution.png has changed
    18.1 Binary file web/support/icons/favicon.png has changed
    19.1 Binary file web/support/icons/important.png has changed
    20.1 Binary file web/support/icons/note.png has changed
    21.1 Binary file web/support/icons/remark.png has changed
    22.1 Binary file web/support/icons/rss.png has changed
    23.1 Binary file web/support/icons/shell.png has changed
    24.1 Binary file web/support/icons/source.png has changed
    25.1 Binary file web/support/icons/tip.png has changed
    26.1 Binary file web/support/icons/warning.png has changed
    27.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    27.2 +++ b/web/support/javascript/form-min.js	Mon Oct 26 14:46:22 2009 +0100
    27.3 @@ -0,0 +1,1 @@
    27.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);
    27.5 \ No newline at end of file
    28.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    28.2 +++ b/web/support/javascript/form.js	Mon Oct 26 14:46:22 2009 +0100
    28.3 @@ -0,0 +1,819 @@
    28.4 +/*
    28.5 + * jQuery Form Plugin
    28.6 + * @requires jQuery v1.1 or later
    28.7 + *
    28.8 + * Examples at: http://malsup.com/jquery/form/
    28.9 + * Dual licensed under the MIT and GPL licenses:
   28.10 + *   http://www.opensource.org/licenses/mit-license.php
   28.11 + *   http://www.gnu.org/licenses/gpl.html
   28.12 + *
   28.13 + * Revision: $Id$
   28.14 + */
   28.15 + (function($) {
   28.16 +/**
   28.17 + * ajaxSubmit() provides a mechanism for submitting an HTML form using AJAX.
   28.18 + *
   28.19 + * ajaxSubmit accepts a single argument which can be either a success callback function
   28.20 + * or an options Object.  If a function is provided it will be invoked upon successful
   28.21 + * completion of the submit and will be passed the response from the server.
   28.22 + * If an options Object is provided, the following attributes are supported:
   28.23 + *
   28.24 + *  target:   Identifies the element(s) in the page to be updated with the server response.
   28.25 + *            This value may be specified as a jQuery selection string, a jQuery object,
   28.26 + *            or a DOM element.
   28.27 + *            default value: null
   28.28 + *
   28.29 + *  url:      URL to which the form data will be submitted.
   28.30 + *            default value: value of form's 'action' attribute
   28.31 + *
   28.32 + *  type:     The method in which the form data should be submitted, 'GET' or 'POST'.
   28.33 + *            default value: value of form's 'method' attribute (or 'GET' if none found)
   28.34 + *
   28.35 + *  data:     Additional data to add to the request, specified as key/value pairs (see $.ajax).
   28.36 + *
   28.37 + *  beforeSubmit:  Callback method to be invoked before the form is submitted.
   28.38 + *            default value: null
   28.39 + *
   28.40 + *  success:  Callback method to be invoked after the form has been successfully submitted
   28.41 + *            and the response has been returned from the server
   28.42 + *            default value: null
   28.43 + *
   28.44 + *  dataType: Expected dataType of the response.  One of: null, 'xml', 'script', or 'json'
   28.45 + *            default value: null
   28.46 + *
   28.47 + *  semantic: Boolean flag indicating whether data must be submitted in semantic order (slower).
   28.48 + *            default value: false
   28.49 + *
   28.50 + *  resetForm: Boolean flag indicating whether the form should be reset if the submit is successful
   28.51 + *
   28.52 + *  clearForm: Boolean flag indicating whether the form should be cleared if the submit is successful
   28.53 + *
   28.54 + *
   28.55 + * The 'beforeSubmit' callback can be provided as a hook for running pre-submit logic or for
   28.56 + * validating the form data.  If the 'beforeSubmit' callback returns false then the form will
   28.57 + * not be submitted. The 'beforeSubmit' callback is invoked with three arguments: the form data
   28.58 + * in array format, the jQuery object, and the options object passed into ajaxSubmit.
   28.59 + * The form data array takes the following form:
   28.60 + *
   28.61 + *     [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
   28.62 + *
   28.63 + * If a 'success' callback method is provided it is invoked after the response has been returned
   28.64 + * from the server.  It is passed the responseText or responseXML value (depending on dataType).
   28.65 + * See jQuery.ajax for further details.
   28.66 + *
   28.67 + *
   28.68 + * The dataType option provides a means for specifying how the server response should be handled.
   28.69 + * This maps directly to the jQuery.httpData method.  The following values are supported:
   28.70 + *
   28.71 + *      'xml':    if dataType == 'xml' the server response is treated as XML and the 'success'
   28.72 + *                   callback method, if specified, will be passed the responseXML value
   28.73 + *      'json':   if dataType == 'json' the server response will be evaluted and passed to
   28.74 + *                   the 'success' callback, if specified
   28.75 + *      'script': if dataType == 'script' the server response is evaluated in the global context
   28.76 + *
   28.77 + *
   28.78 + * Note that it does not make sense to use both the 'target' and 'dataType' options.  If both
   28.79 + * are provided the target will be ignored.
   28.80 + *
   28.81 + * The semantic argument can be used to force form serialization in semantic order.
   28.82 + * This is normally true anyway, unless the form contains input elements of type='image'.
   28.83 + * If your form must be submitted with name/value pairs in semantic order and your form
   28.84 + * contains an input of type='image" then pass true for this arg, otherwise pass false
   28.85 + * (or nothing) to avoid the overhead for this logic.
   28.86 + *
   28.87 + *
   28.88 + * When used on its own, ajaxSubmit() is typically bound to a form's submit event like this:
   28.89 + *
   28.90 + * $("#form-id").submit(function() {
   28.91 + *     $(this).ajaxSubmit(options);
   28.92 + *     return false; // cancel conventional submit
   28.93 + * });
   28.94 + *
   28.95 + * When using ajaxForm(), however, this is done for you.
   28.96 + *
   28.97 + * @example
   28.98 + * $('#myForm').ajaxSubmit(function(data) {
   28.99 + *     alert('Form submit succeeded! Server returned: ' + data);
  28.100 + * });
  28.101 + * @desc Submit form and alert server response
  28.102 + *
  28.103 + *
  28.104 + * @example
  28.105 + * var options = {
  28.106 + *     target: '#myTargetDiv'
  28.107 + * };
  28.108 + * $('#myForm').ajaxSubmit(options);
  28.109 + * @desc Submit form and update page element with server response
  28.110 + *
  28.111 + *
  28.112 + * @example
  28.113 + * var options = {
  28.114 + *     success: function(responseText) {
  28.115 + *         alert(responseText);
  28.116 + *     }
  28.117 + * };
  28.118 + * $('#myForm').ajaxSubmit(options);
  28.119 + * @desc Submit form and alert the server response
  28.120 + *
  28.121 + *
  28.122 + * @example
  28.123 + * var options = {
  28.124 + *     beforeSubmit: function(formArray, jqForm) {
  28.125 + *         if (formArray.length == 0) {
  28.126 + *             alert('Please enter data.');
  28.127 + *             return false;
  28.128 + *         }
  28.129 + *     }
  28.130 + * };
  28.131 + * $('#myForm').ajaxSubmit(options);
  28.132 + * @desc Pre-submit validation which aborts the submit operation if form data is empty
  28.133 + *
  28.134 + *
  28.135 + * @example
  28.136 + * var options = {
  28.137 + *     url: myJsonUrl.php,
  28.138 + *     dataType: 'json',
  28.139 + *     success: function(data) {
  28.140 + *        // 'data' is an object representing the the evaluated json data
  28.141 + *     }
  28.142 + * };
  28.143 + * $('#myForm').ajaxSubmit(options);
  28.144 + * @desc json data returned and evaluated
  28.145 + *
  28.146 + *
  28.147 + * @example
  28.148 + * var options = {
  28.149 + *     url: myXmlUrl.php,
  28.150 + *     dataType: 'xml',
  28.151 + *     success: function(responseXML) {
  28.152 + *        // responseXML is XML document object
  28.153 + *        var data = $('myElement', responseXML).text();
  28.154 + *     }
  28.155 + * };
  28.156 + * $('#myForm').ajaxSubmit(options);
  28.157 + * @desc XML data returned from server
  28.158 + *
  28.159 + *
  28.160 + * @example
  28.161 + * var options = {
  28.162 + *     resetForm: true
  28.163 + * };
  28.164 + * $('#myForm').ajaxSubmit(options);
  28.165 + * @desc submit form and reset it if successful
  28.166 + *
  28.167 + * @example
  28.168 + * $('#myForm).submit(function() {
  28.169 + *    $(this).ajaxSubmit();
  28.170 + *    return false;
  28.171 + * });
  28.172 + * @desc Bind form's submit event to use ajaxSubmit
  28.173 + *
  28.174 + *
  28.175 + * @name ajaxSubmit
  28.176 + * @type jQuery
  28.177 + * @param options  object literal containing options which control the form submission process
  28.178 + * @cat Plugins/Form
  28.179 + * @return jQuery
  28.180 + */
  28.181 +$.fn.ajaxSubmit = function(options) {
  28.182 +    if (typeof options == 'function')
  28.183 +        options = { success: options };
  28.184 +
  28.185 +    options = $.extend({
  28.186 +        url:  this.attr('action') || window.location,
  28.187 +        type: this.attr('method') || 'GET'
  28.188 +    }, options || {});
  28.189 +
  28.190 +    // hook for manipulating the form data before it is extracted;
  28.191 +    // convenient for use with rich editors like tinyMCE or FCKEditor
  28.192 +    var veto = {};
  28.193 +    $.event.trigger('form.pre.serialize', [this, options, veto]);
  28.194 +    if (veto.veto) return this;
  28.195 +
  28.196 +    var a = this.formToArray(options.semantic);
  28.197 +	if (options.data) {
  28.198 +	    for (var n in options.data)
  28.199 +	        a.push( { name: n, value: options.data[n] } );
  28.200 +	}
  28.201 +
  28.202 +    // give pre-submit callback an opportunity to abort the submit
  28.203 +    if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) return this;
  28.204 +
  28.205 +    // fire vetoable 'validate' event
  28.206 +    $.event.trigger('form.submit.validate', [a, this, options, veto]);
  28.207 +    if (veto.veto) return this;
  28.208 +
  28.209 +    var q = $.param(a);//.replace(/%20/g,'+');
  28.210 +
  28.211 +    if (options.type.toUpperCase() == 'GET') {
  28.212 +        options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
  28.213 +        options.data = null;  // data is null for 'get'
  28.214 +    }
  28.215 +    else
  28.216 +        options.data = q; // data is the query string for 'post'
  28.217 +
  28.218 +    var $form = this, callbacks = [];
  28.219 +    if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
  28.220 +    if (options.clearForm) callbacks.push(function() { $form.clearForm(); });
  28.221 +
  28.222 +    // perform a load on the target only if dataType is not provided
  28.223 +    if (!options.dataType && options.target) {
  28.224 +        var oldSuccess = options.success || function(){};
  28.225 +        callbacks.push(function(data) {
  28.226 +            if (this.evalScripts)
  28.227 +                $(options.target).attr("innerHTML", data).evalScripts().each(oldSuccess, arguments);
  28.228 +            else // jQuery v1.1.4
  28.229 +                $(options.target).html(data).each(oldSuccess, arguments);
  28.230 +        });
  28.231 +    }
  28.232 +    else if (options.success)
  28.233 +        callbacks.push(options.success);
  28.234 +
  28.235 +    options.success = function(data, status) {
  28.236 +        for (var i=0, max=callbacks.length; i < max; i++)
  28.237 +            callbacks[i](data, status, $form);
  28.238 +    };
  28.239 +
  28.240 +    // are there files to upload?
  28.241 +    var files = $('input:file', this).fieldValue();
  28.242 +    var found = false;
  28.243 +    for (var j=0; j < files.length; j++)
  28.244 +        if (files[j])
  28.245 +            found = true;
  28.246 +
  28.247 +    if (options.iframe || found) // options.iframe allows user to force iframe mode
  28.248 +        fileUpload();
  28.249 +    else
  28.250 +        $.ajax(options);
  28.251 +
  28.252 +    // fire 'notify' event
  28.253 +    $.event.trigger('form.submit.notify', [this, options]);
  28.254 +    return this;
  28.255 +
  28.256 +
  28.257 +    // private function for handling file uploads (hat tip to YAHOO!)
  28.258 +    function fileUpload() {
  28.259 +        var form = $form[0];
  28.260 +        var opts = $.extend({}, $.ajaxSettings, options);
  28.261 +
  28.262 +        var id = 'jqFormIO' + $.fn.ajaxSubmit.counter++;
  28.263 +        var $io = $('<iframe id="' + id + '" name="' + id + '" />');
  28.264 +        var io = $io[0];
  28.265 +        var op8 = $.browser.opera && window.opera.version() < 9;
  28.266 +        if ($.browser.msie || op8) io.src = 'javascript:false;document.write("");';
  28.267 +        $io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });
  28.268 +
  28.269 +        var xhr = { // mock object
  28.270 +            responseText: null,
  28.271 +            responseXML: null,
  28.272 +            status: 0,
  28.273 +            statusText: 'n/a',
  28.274 +            getAllResponseHeaders: function() {},
  28.275 +            getResponseHeader: function() {},
  28.276 +            setRequestHeader: function() {}
  28.277 +        };
  28.278 +
  28.279 +        var g = opts.global;
  28.280 +        // trigger ajax global events so that activity/block indicators work like normal
  28.281 +        if (g && ! $.active++) $.event.trigger("ajaxStart");
  28.282 +        if (g) $.event.trigger("ajaxSend", [xhr, opts]);
  28.283 +
  28.284 +        var cbInvoked = 0;
  28.285 +        var timedOut = 0;
  28.286 +
  28.287 +        // take a breath so that pending repaints get some cpu time before the upload starts
  28.288 +        setTimeout(function() {
  28.289 +            $io.appendTo('body');
  28.290 +            // jQuery's event binding doesn't work for iframe events in IE
  28.291 +            io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
  28.292 +
  28.293 +            // make sure form attrs are set
  28.294 +            var encAttr = form.encoding ? 'encoding' : 'enctype';
  28.295 +            var t = $form.attr('target');
  28.296 +            $form.attr({
  28.297 +                target:   id,
  28.298 +                method:  'POST',
  28.299 +                action:   opts.url
  28.300 +            });
  28.301 +            form[encAttr] = 'multipart/form-data';
  28.302 +
  28.303 +            // support timout
  28.304 +            if (opts.timeout)
  28.305 +                setTimeout(function() { timedOut = true; cb(); }, opts.timeout);
  28.306 +
  28.307 +            form.submit();
  28.308 +            $form.attr('target', t); // reset target
  28.309 +        }, 10);
  28.310 +
  28.311 +        function cb() {
  28.312 +            if (cbInvoked++) return;
  28.313 +
  28.314 +            io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);
  28.315 +
  28.316 +            var ok = true;
  28.317 +            try {
  28.318 +                if (timedOut) throw 'timeout';
  28.319 +                // extract the server response from the iframe
  28.320 +                var data, doc;
  28.321 +                doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
  28.322 +                xhr.responseText = doc.body ? doc.body.innerHTML : null;
  28.323 +                xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
  28.324 +
  28.325 +                if (opts.dataType == 'json' || opts.dataType == 'script') {
  28.326 +                    var ta = doc.getElementsByTagName('textarea')[0];
  28.327 +                    data = ta ? ta.value : xhr.responseText;
  28.328 +                    if (opts.dataType == 'json')
  28.329 +                        eval("data = " + data);
  28.330 +                    else
  28.331 +                        $.globalEval(data);
  28.332 +                }
  28.333 +                else if (opts.dataType == 'xml') {
  28.334 +                    data = xhr.responseXML;
  28.335 +                    if (!data && xhr.responseText != null)
  28.336 +                        data = toXml(xhr.responseText);
  28.337 +                }
  28.338 +                else {
  28.339 +                    data = xhr.responseText;
  28.340 +                }
  28.341 +            }
  28.342 +            catch(e){
  28.343 +                ok = false;
  28.344 +                $.handleError(opts, xhr, 'error', e);
  28.345 +            }
  28.346 +
  28.347 +            // ordering of these callbacks/triggers is odd, but that's how $.ajax does it
  28.348 +            if (ok) {
  28.349 +                opts.success(data, 'success');
  28.350 +                if (g) $.event.trigger("ajaxSuccess", [xhr, opts]);
  28.351 +            }
  28.352 +            if (g) $.event.trigger("ajaxComplete", [xhr, opts]);
  28.353 +            if (g && ! --$.active) $.event.trigger("ajaxStop");
  28.354 +            if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');
  28.355 +
  28.356 +            // clean up
  28.357 +            setTimeout(function() {
  28.358 +                $io.remove();
  28.359 +                xhr.responseXML = null;
  28.360 +            }, 100);
  28.361 +        };
  28.362 +
  28.363 +        function toXml(s, doc) {
  28.364 +            if (window.ActiveXObject) {
  28.365 +                doc = new ActiveXObject('Microsoft.XMLDOM');
  28.366 +                doc.async = 'false';
  28.367 +                doc.loadXML(s);
  28.368 +            }
  28.369 +            else
  28.370 +                doc = (new DOMParser()).parseFromString(s, 'text/xml');
  28.371 +            return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
  28.372 +        };
  28.373 +    };
  28.374 +};
  28.375 +$.fn.ajaxSubmit.counter = 0; // used to create unique iframe ids
  28.376 +
  28.377 +/**
  28.378 + * ajaxForm() provides a mechanism for fully automating form submission.
  28.379 + *
  28.380 + * The advantages of using this method instead of ajaxSubmit() are:
  28.381 + *
  28.382 + * 1: This method will include coordinates for <input type="image" /> elements (if the element
  28.383 + *    is used to submit the form).
  28.384 + * 2. This method will include the submit element's name/value data (for the element that was
  28.385 + *    used to submit the form).
  28.386 + * 3. This method binds the submit() method to the form for you.
  28.387 + *
  28.388 + * Note that for accurate x/y coordinates of image submit elements in all browsers
  28.389 + * you need to also use the "dimensions" plugin (this method will auto-detect its presence).
  28.390 + *
  28.391 + * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
  28.392 + * passes the options argument along after properly binding events for submit elements and
  28.393 + * the form itself.  See ajaxSubmit for a full description of the options argument.
  28.394 + *
  28.395 + *
  28.396 + * @example
  28.397 + * var options = {
  28.398 + *     target: '#myTargetDiv'
  28.399 + * };
  28.400 + * $('#myForm').ajaxSForm(options);
  28.401 + * @desc Bind form's submit event so that 'myTargetDiv' is updated with the server response
  28.402 + *       when the form is submitted.
  28.403 + *
  28.404 + *
  28.405 + * @example
  28.406 + * var options = {
  28.407 + *     success: function(responseText) {
  28.408 + *         alert(responseText);
  28.409 + *     }
  28.410 + * };
  28.411 + * $('#myForm').ajaxSubmit(options);
  28.412 + * @desc Bind form's submit event so that server response is alerted after the form is submitted.
  28.413 + *
  28.414 + *
  28.415 + * @example
  28.416 + * var options = {
  28.417 + *     beforeSubmit: function(formArray, jqForm) {
  28.418 + *         if (formArray.length == 0) {
  28.419 + *             alert('Please enter data.');
  28.420 + *             return false;
  28.421 + *         }
  28.422 + *     }
  28.423 + * };
  28.424 + * $('#myForm').ajaxSubmit(options);
  28.425 + * @desc Bind form's submit event so that pre-submit callback is invoked before the form
  28.426 + *       is submitted.
  28.427 + *
  28.428 + *
  28.429 + * @name   ajaxForm
  28.430 + * @param  options  object literal containing options which control the form submission process
  28.431 + * @return jQuery
  28.432 + * @cat    Plugins/Form
  28.433 + * @type   jQuery
  28.434 + */
  28.435 +$.fn.ajaxForm = function(options) {
  28.436 +    return this.ajaxFormUnbind().submit(submitHandler).each(function() {
  28.437 +        // store options in hash
  28.438 +        this.formPluginId = $.fn.ajaxForm.counter++;
  28.439 +        $.fn.ajaxForm.optionHash[this.formPluginId] = options;
  28.440 +        $(":submit,input:image", this).click(clickHandler);
  28.441 +    });
  28.442 +};
  28.443 +
  28.444 +$.fn.ajaxForm.counter = 1;
  28.445 +$.fn.ajaxForm.optionHash = {};
  28.446 +
  28.447 +function clickHandler(e) {
  28.448 +    var $form = this.form;
  28.449 +    $form.clk = this;
  28.450 +    if (this.type == 'image') {
  28.451 +        if (e.offsetX != undefined) {
  28.452 +            $form.clk_x = e.offsetX;
  28.453 +            $form.clk_y = e.offsetY;
  28.454 +        } else if (typeof $.fn.offset == 'function') { // try to use dimensions plugin
  28.455 +            var offset = $(this).offset();
  28.456 +            $form.clk_x = e.pageX - offset.left;
  28.457 +            $form.clk_y = e.pageY - offset.top;
  28.458 +        } else {
  28.459 +            $form.clk_x = e.pageX - this.offsetLeft;
  28.460 +            $form.clk_y = e.pageY - this.offsetTop;
  28.461 +        }
  28.462 +    }
  28.463 +    // clear form vars
  28.464 +    setTimeout(function() { $form.clk = $form.clk_x = $form.clk_y = null; }, 10);
  28.465 +};
  28.466 +
  28.467 +function submitHandler() {
  28.468 +    // retrieve options from hash
  28.469 +    var id = this.formPluginId;
  28.470 +    var options = $.fn.ajaxForm.optionHash[id];
  28.471 +    $(this).ajaxSubmit(options);
  28.472 +    return false;
  28.473 +};
  28.474 +
  28.475 +/**
  28.476 + * ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
  28.477 + *
  28.478 + * @name   ajaxFormUnbind
  28.479 + * @return jQuery
  28.480 + * @cat    Plugins/Form
  28.481 + * @type   jQuery
  28.482 + */
  28.483 +$.fn.ajaxFormUnbind = function() {
  28.484 +    this.unbind('submit', submitHandler);
  28.485 +    return this.each(function() {
  28.486 +        $(":submit,input:image", this).unbind('click', clickHandler);
  28.487 +    });
  28.488 +
  28.489 +};
  28.490 +
  28.491 +/**
  28.492 + * formToArray() gathers form element data into an array of objects that can
  28.493 + * be passed to any of the following ajax functions: $.get, $.post, or load.
  28.494 + * Each object in the array has both a 'name' and 'value' property.  An example of
  28.495 + * an array for a simple login form might be:
  28.496 + *
  28.497 + * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
  28.498 + *
  28.499 + * It is this array that is passed to pre-submit callback functions provided to the
  28.500 + * ajaxSubmit() and ajaxForm() methods.
  28.501 + *
  28.502 + * The semantic argument can be used to force form serialization in semantic order.
  28.503 + * This is normally true anyway, unless the form contains input elements of type='image'.
  28.504 + * If your form must be submitted with name/value pairs in semantic order and your form
  28.505 + * contains an input of type='image" then pass true for this arg, otherwise pass false
  28.506 + * (or nothing) to avoid the overhead for this logic.
  28.507 + *
  28.508 + * @example var data = $("#myForm").formToArray();
  28.509 + * $.post( "myscript.cgi", data );
  28.510 + * @desc Collect all the data from a form and submit it to the server.
  28.511 + *
  28.512 + * @name formToArray
  28.513 + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  28.514 + * @type Array<Object>
  28.515 + * @cat Plugins/Form
  28.516 + */
  28.517 +$.fn.formToArray = function(semantic) {
  28.518 +    var a = [];
  28.519 +    if (this.length == 0) return a;
  28.520 +
  28.521 +    var form = this[0];
  28.522 +    var els = semantic ? form.getElementsByTagName('*') : form.elements;
  28.523 +    if (!els) return a;
  28.524 +    for(var i=0, max=els.length; i < max; i++) {
  28.525 +        var el = els[i];
  28.526 +        var n = el.name;
  28.527 +        if (!n) continue;
  28.528 +
  28.529 +        if (semantic && form.clk && el.type == "image") {
  28.530 +            // handle image inputs on the fly when semantic == true
  28.531 +            if(!el.disabled && form.clk == el)
  28.532 +                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  28.533 +            continue;
  28.534 +        }
  28.535 +
  28.536 +        var v = $.fieldValue(el, true);
  28.537 +        if (v && v.constructor == Array) {
  28.538 +            for(var j=0, jmax=v.length; j < jmax; j++)
  28.539 +                a.push({name: n, value: v[j]});
  28.540 +        }
  28.541 +        else if (v !== null && typeof v != 'undefined')
  28.542 +            a.push({name: n, value: v});
  28.543 +    }
  28.544 +
  28.545 +    if (!semantic && form.clk) {
  28.546 +        // input type=='image' are not found in elements array! handle them here
  28.547 +        var inputs = form.getElementsByTagName("input");
  28.548 +        for(var i=0, max=inputs.length; i < max; i++) {
  28.549 +            var input = inputs[i];
  28.550 +            var n = input.name;
  28.551 +            if(n && !input.disabled && input.type == "image" && form.clk == input)
  28.552 +                a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
  28.553 +        }
  28.554 +    }
  28.555 +    return a;
  28.556 +};
  28.557 +
  28.558 +
  28.559 +/**
  28.560 + * Serializes form data into a 'submittable' string. This method will return a string
  28.561 + * in the format: name1=value1&amp;name2=value2
  28.562 + *
  28.563 + * The semantic argument can be used to force form serialization in semantic order.
  28.564 + * If your form must be submitted with name/value pairs in semantic order then pass
  28.565 + * true for this arg, otherwise pass false (or nothing) to avoid the overhead for
  28.566 + * this logic (which can be significant for very large forms).
  28.567 + *
  28.568 + * @example var data = $("#myForm").formSerialize();
  28.569 + * $.ajax('POST', "myscript.cgi", data);
  28.570 + * @desc Collect all the data from a form into a single string
  28.571 + *
  28.572 + * @name formSerialize
  28.573 + * @param semantic true if serialization must maintain strict semantic ordering of elements (slower)
  28.574 + * @type String
  28.575 + * @cat Plugins/Form
  28.576 + */
  28.577 +$.fn.formSerialize = function(semantic) {
  28.578 +    //hand off to jQuery.param for proper encoding
  28.579 +    return $.param(this.formToArray(semantic));
  28.580 +};
  28.581 +
  28.582 +
  28.583 +/**
  28.584 + * Serializes all field elements in the jQuery object into a query string.
  28.585 + * This method will return a string in the format: name1=value1&amp;name2=value2
  28.586 + *
  28.587 + * The successful argument controls whether or not serialization is limited to
  28.588 + * 'successful' controls (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  28.589 + * The default value of the successful argument is true.
  28.590 + *
  28.591 + * @example var data = $("input").formSerialize();
  28.592 + * @desc Collect the data from all successful input elements into a query string
  28.593 + *
  28.594 + * @example var data = $(":radio").formSerialize();
  28.595 + * @desc Collect the data from all successful radio input elements into a query string
  28.596 + *
  28.597 + * @example var data = $("#myForm :checkbox").formSerialize();
  28.598 + * @desc Collect the data from all successful checkbox input elements in myForm into a query string
  28.599 + *
  28.600 + * @example var data = $("#myForm :checkbox").formSerialize(false);
  28.601 + * @desc Collect the data from all checkbox elements in myForm (even the unchecked ones) into a query string
  28.602 + *
  28.603 + * @example var data = $(":input").formSerialize();
  28.604 + * @desc Collect the data from all successful input, select, textarea and button elements into a query string
  28.605 + *
  28.606 + * @name fieldSerialize
  28.607 + * @param successful true if only successful controls should be serialized (default is true)
  28.608 + * @type String
  28.609 + * @cat Plugins/Form
  28.610 + */
  28.611 +$.fn.fieldSerialize = function(successful) {
  28.612 +    var a = [];
  28.613 +    this.each(function() {
  28.614 +        var n = this.name;
  28.615 +        if (!n) return;
  28.616 +        var v = $.fieldValue(this, successful);
  28.617 +        if (v && v.constructor == Array) {
  28.618 +            for (var i=0,max=v.length; i < max; i++)
  28.619 +                a.push({name: n, value: v[i]});
  28.620 +        }
  28.621 +        else if (v !== null && typeof v != 'undefined')
  28.622 +            a.push({name: this.name, value: v});
  28.623 +    });
  28.624 +    //hand off to jQuery.param for proper encoding
  28.625 +    return $.param(a);
  28.626 +};
  28.627 +
  28.628 +
  28.629 +/**
  28.630 + * Returns the value(s) of the element in the matched set.  For example, consider the following form:
  28.631 + *
  28.632 + *  <form><fieldset>
  28.633 + *      <input name="A" type="text" />
  28.634 + *      <input name="A" type="text" />
  28.635 + *      <input name="B" type="checkbox" value="B1" />
  28.636 + *      <input name="B" type="checkbox" value="B2"/>
  28.637 + *      <input name="C" type="radio" value="C1" />
  28.638 + *      <input name="C" type="radio" value="C2" />
  28.639 + *  </fieldset></form>
  28.640 + *
  28.641 + *  var v = $(':text').fieldValue();
  28.642 + *  // if no values are entered into the text inputs
  28.643 + *  v == ['','']
  28.644 + *  // if values entered into the text inputs are 'foo' and 'bar'
  28.645 + *  v == ['foo','bar']
  28.646 + *
  28.647 + *  var v = $(':checkbox').fieldValue();
  28.648 + *  // if neither checkbox is checked
  28.649 + *  v === undefined
  28.650 + *  // if both checkboxes are checked
  28.651 + *  v == ['B1', 'B2']
  28.652 + *
  28.653 + *  var v = $(':radio').fieldValue();
  28.654 + *  // if neither radio is checked
  28.655 + *  v === undefined
  28.656 + *  // if first radio is checked
  28.657 + *  v == ['C1']
  28.658 + *
  28.659 + * The successful argument controls whether or not the field element must be 'successful'
  28.660 + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  28.661 + * The default value of the successful argument is true.  If this value is false the value(s)
  28.662 + * for each element is returned.
  28.663 + *
  28.664 + * Note: This method *always* returns an array.  If no valid value can be determined the
  28.665 + *       array will be empty, otherwise it will contain one or more values.
  28.666 + *
  28.667 + * @example var data = $("#myPasswordElement").fieldValue();
  28.668 + * alert(data[0]);
  28.669 + * @desc Alerts the current value of the myPasswordElement element
  28.670 + *
  28.671 + * @example var data = $("#myForm :input").fieldValue();
  28.672 + * @desc Get the value(s) of the form elements in myForm
  28.673 + *
  28.674 + * @example var data = $("#myForm :checkbox").fieldValue();
  28.675 + * @desc Get the value(s) for the successful checkbox element(s) in the jQuery object.
  28.676 + *
  28.677 + * @example var data = $("#mySingleSelect").fieldValue();
  28.678 + * @desc Get the value(s) of the select control
  28.679 + *
  28.680 + * @example var data = $(':text').fieldValue();
  28.681 + * @desc Get the value(s) of the text input or textarea elements
  28.682 + *
  28.683 + * @example var data = $("#myMultiSelect").fieldValue();
  28.684 + * @desc Get the values for the select-multiple control
  28.685 + *
  28.686 + * @name fieldValue
  28.687 + * @param Boolean successful true if only the values for successful controls should be returned (default is true)
  28.688 + * @type Array<String>
  28.689 + * @cat Plugins/Form
  28.690 + */
  28.691 +$.fn.fieldValue = function(successful) {
  28.692 +    for (var val=[], i=0, max=this.length; i < max; i++) {
  28.693 +        var el = this[i];
  28.694 +        var v = $.fieldValue(el, successful);
  28.695 +        if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
  28.696 +            continue;
  28.697 +        v.constructor == Array ? $.merge(val, v) : val.push(v);
  28.698 +    }
  28.699 +    return val;
  28.700 +};
  28.701 +
  28.702 +/**
  28.703 + * Returns the value of the field element.
  28.704 + *
  28.705 + * The successful argument controls whether or not the field element must be 'successful'
  28.706 + * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
  28.707 + * The default value of the successful argument is true.  If the given element is not
  28.708 + * successful and the successful arg is not false then the returned value will be null.
  28.709 + *
  28.710 + * Note: If the successful flag is true (default) but the element is not successful, the return will be null
  28.711 + * Note: The value returned for a successful select-multiple element will always be an array.
  28.712 + * Note: If the element has no value the return value will be undefined.
  28.713 + *
  28.714 + * @example var data = jQuery.fieldValue($("#myPasswordElement")[0]);
  28.715 + * @desc Gets the current value of the myPasswordElement element
  28.716 + *
  28.717 + * @name fieldValue
  28.718 + * @param Element el The DOM element for which the value will be returned
  28.719 + * @param Boolean successful true if value returned must be for a successful controls (default is true)
  28.720 + * @type String or Array<String> or null or undefined
  28.721 + * @cat Plugins/Form
  28.722 + */
  28.723 +$.fieldValue = function(el, successful) {
  28.724 +    var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
  28.725 +    if (typeof successful == 'undefined') successful = true;
  28.726 +
  28.727 +    if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
  28.728 +        (t == 'checkbox' || t == 'radio') && !el.checked ||
  28.729 +        (t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
  28.730 +        tag == 'select' && el.selectedIndex == -1))
  28.731 +            return null;
  28.732 +
  28.733 +    if (tag == 'select') {
  28.734 +        var index = el.selectedIndex;
  28.735 +        if (index < 0) return null;
  28.736 +        var a = [], ops = el.options;
  28.737 +        var one = (t == 'select-one');
  28.738 +        var max = (one ? index+1 : ops.length);
  28.739 +        for(var i=(one ? index : 0); i < max; i++) {
  28.740 +            var op = ops[i];
  28.741 +            if (op.selected) {
  28.742 +                // extra pain for IE...
  28.743 +                var v = $.browser.msie && !(op.attributes['value'].specified) ? op.text : op.value;
  28.744 +                if (one) return v;
  28.745 +                a.push(v);
  28.746 +            }
  28.747 +        }
  28.748 +        return a;
  28.749 +    }
  28.750 +    return el.value;
  28.751 +};
  28.752 +
  28.753 +
  28.754 +/**
  28.755 + * Clears the form data.  Takes the following actions on the form's input fields:
  28.756 + *  - input text fields will have their 'value' property set to the empty string
  28.757 + *  - select elements will have their 'selectedIndex' property set to -1
  28.758 + *  - checkbox and radio inputs will have their 'checked' property set to false
  28.759 + *  - inputs of type submit, button, reset, and hidden will *not* be effected
  28.760 + *  - button elements will *not* be effected
  28.761 + *
  28.762 + * @example $('form').clearForm();
  28.763 + * @desc Clears all forms on the page.
  28.764 + *
  28.765 + * @name clearForm
  28.766 + * @type jQuery
  28.767 + * @cat Plugins/Form
  28.768 + */
  28.769 +$.fn.clearForm = function() {
  28.770 +    return this.each(function() {
  28.771 +        $('input,select,textarea', this).clearFields();
  28.772 +    });
  28.773 +};
  28.774 +
  28.775 +/**
  28.776 + * Clears the selected form elements.  Takes the following actions on the matched elements:
  28.777 + *  - input text fields will have their 'value' property set to the empty string
  28.778 + *  - select elements will have their 'selectedIndex' property set to -1
  28.779 + *  - checkbox and radio inputs will have their 'checked' property set to false
  28.780 + *  - inputs of type submit, button, reset, and hidden will *not* be effected
  28.781 + *  - button elements will *not* be effected
  28.782 + *
  28.783 + * @example $('.myInputs').clearFields();
  28.784 + * @desc Clears all inputs with class myInputs
  28.785 + *
  28.786 + * @name clearFields
  28.787 + * @type jQuery
  28.788 + * @cat Plugins/Form
  28.789 + */
  28.790 +$.fn.clearFields = $.fn.clearInputs = function() {
  28.791 +    return this.each(function() {
  28.792 +        var t = this.type, tag = this.tagName.toLowerCase();
  28.793 +        if (t == 'text' || t == 'password' || tag == 'textarea')
  28.794 +            this.value = '';
  28.795 +        else if (t == 'checkbox' || t == 'radio')
  28.796 +            this.checked = false;
  28.797 +        else if (tag == 'select')
  28.798 +            this.selectedIndex = -1;
  28.799 +    });
  28.800 +};
  28.801 +
  28.802 +
  28.803 +/**
  28.804 + * Resets the form data.  Causes all form elements to be reset to their original value.
  28.805 + *
  28.806 + * @example $('form').resetForm();
  28.807 + * @desc Resets all forms on the page.
  28.808 + *
  28.809 + * @name resetForm
  28.810 + * @type jQuery
  28.811 + * @cat Plugins/Form
  28.812 + */
  28.813 +$.fn.resetForm = function() {
  28.814 +    return this.each(function() {
  28.815 +        // guard against an input with the name of 'reset'
  28.816 +        // note that IE reports the reset function as an 'object'
  28.817 +        if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
  28.818 +            this.reset();
  28.819 +    });
  28.820 +};
  28.821 +
  28.822 +})(jQuery);
    29.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    29.2 +++ b/web/support/javascript/jquery-min.js	Mon Oct 26 14:46:22 2009 +0100
    29.3 @@ -0,0 +1,31 @@
    29.4 +/*
    29.5 + * jQuery 1.2.1 - New Wave Javascript
    29.6 + *
    29.7 + * Copyright (c) 2007 John Resig (jquery.com)
    29.8 + * Dual licensed under the MIT (MIT-LICENSE.txt)
    29.9 + * and GPL (GPL-LICENSE.txt) licenses.
   29.10 + *
   29.11 + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   29.12 + * $Rev: 3353 $
   29.13 + */
   29.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
   29.15 +selector=[];}}else
   29.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
   29.17 +return this[0].value.replace(/\r/g,"");}}else
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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
   29.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;}};})();
   29.35 \ No newline at end of file
    30.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    30.2 +++ b/web/support/javascript/jquery.js	Mon Oct 26 14:46:22 2009 +0100
    30.3 @@ -0,0 +1,2992 @@
    30.4 +(function(){
    30.5 +/*
    30.6 + * jQuery 1.2.1 - New Wave Javascript
    30.7 + *
    30.8 + * Copyright (c) 2007 John Resig (jquery.com)
    30.9 + * Dual licensed under the MIT (MIT-LICENSE.txt)
   30.10 + * and GPL (GPL-LICENSE.txt) licenses.
   30.11 + *
   30.12 + * $Date: 2007-09-16 23:42:06 -0400 (Sun, 16 Sep 2007) $
   30.13 + * $Rev: 3353 $
   30.14 + */
   30.15 +
   30.16 +// Map over jQuery in case of overwrite
   30.17 +if ( typeof jQuery != "undefined" )
   30.18 +	var _jQuery = jQuery;
   30.19 +
   30.20 +var jQuery = window.jQuery = function(selector, context) {
   30.21 +	// If the context is a namespace object, return a new object
   30.22 +	return this instanceof jQuery ?
   30.23 +		this.init(selector, context) :
   30.24 +		new jQuery(selector, context);
   30.25 +};
   30.26 +
   30.27 +// Map over the $ in case of overwrite
   30.28 +if ( typeof $ != "undefined" )
   30.29 +	var _$ = $;
   30.30 +	
   30.31 +// Map the jQuery namespace to the '$' one
   30.32 +window.$ = jQuery;
   30.33 +
   30.34 +var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;
   30.35 +
   30.36 +jQuery.fn = jQuery.prototype = {
   30.37 +	init: function(selector, context) {
   30.38 +		// Make sure that a selection was provided
   30.39 +		selector = selector || document;
   30.40 +
   30.41 +		// Handle HTML strings
   30.42 +		if ( typeof selector  == "string" ) {
   30.43 +			var m = quickExpr.exec(selector);
   30.44 +			if ( m && (m[1] || !context) ) {
   30.45 +				// HANDLE: $(html) -> $(array)
   30.46 +				if ( m[1] )
   30.47 +					selector = jQuery.clean( [ m[1] ], context );
   30.48 +
   30.49 +				// HANDLE: $("#id")
   30.50 +				else {
   30.51 +					var tmp = document.getElementById( m[3] );
   30.52 +					if ( tmp )
   30.53 +						// Handle the case where IE and Opera return items
   30.54 +						// by name instead of ID
   30.55 +						if ( tmp.id != m[3] )
   30.56 +							return jQuery().find( selector );
   30.57 +						else {
   30.58 +							this[0] = tmp;
   30.59 +							this.length = 1;
   30.60 +							return this;
   30.61 +						}
   30.62 +					else
   30.63 +						selector = [];
   30.64 +				}
   30.65 +
   30.66 +			// HANDLE: $(expr)
   30.67 +			} else
   30.68 +				return new jQuery( context ).find( selector );
   30.69 +
   30.70 +		// HANDLE: $(function)
   30.71 +		// Shortcut for document ready
   30.72 +		} else if ( jQuery.isFunction(selector) )
   30.73 +			return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( selector );
   30.74 +
   30.75 +		return this.setArray(
   30.76 +			// HANDLE: $(array)
   30.77 +			selector.constructor == Array && selector ||
   30.78 +
   30.79 +			// HANDLE: $(arraylike)
   30.80 +			// Watch for when an array-like object is passed as the selector
   30.81 +			(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||
   30.82 +
   30.83 +			// HANDLE: $(*)
   30.84 +			[ selector ] );
   30.85 +	},
   30.86 +	
   30.87 +	jquery: "1.2.1",
   30.88 +
   30.89 +	size: function() {
   30.90 +		return this.length;
   30.91 +	},
   30.92 +	
   30.93 +	length: 0,
   30.94 +
   30.95 +	get: function( num ) {
   30.96 +		return num == undefined ?
   30.97 +
   30.98 +			// Return a 'clean' array
   30.99 +			jQuery.makeArray( this ) :
  30.100 +
  30.101 +			// Return just the object
  30.102 +			this[num];
  30.103 +	},
  30.104 +	
  30.105 +	pushStack: function( a ) {
  30.106 +		var ret = jQuery(a);
  30.107 +		ret.prevObject = this;
  30.108 +		return ret;
  30.109 +	},
  30.110 +	
  30.111 +	setArray: function( a ) {
  30.112 +		this.length = 0;
  30.113 +		Array.prototype.push.apply( this, a );
  30.114 +		return this;
  30.115 +	},
  30.116 +
  30.117 +	each: function( fn, args ) {
  30.118 +		return jQuery.each( this, fn, args );
  30.119 +	},
  30.120 +
  30.121 +	index: function( obj ) {
  30.122 +		var pos = -1;
  30.123 +		this.each(function(i){
  30.124 +			if ( this == obj ) pos = i;
  30.125 +		});
  30.126 +		return pos;
  30.127 +	},
  30.128 +
  30.129 +	attr: function( key, value, type ) {
  30.130 +		var obj = key;
  30.131 +		
  30.132 +		// Look for the case where we're accessing a style value
  30.133 +		if ( key.constructor == String )
  30.134 +			if ( value == undefined )
  30.135 +				return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
  30.136 +			else {
  30.137 +				obj = {};
  30.138 +				obj[ key ] = value;
  30.139 +			}
  30.140 +		
  30.141 +		// Check to see if we're setting style values
  30.142 +		return this.each(function(index){
  30.143 +			// Set all the styles
  30.144 +			for ( var prop in obj )
  30.145 +				jQuery.attr(
  30.146 +					type ? this.style : this,
  30.147 +					prop, jQuery.prop(this, obj[prop], type, index, prop)
  30.148 +				);
  30.149 +		});
  30.150 +	},
  30.151 +
  30.152 +	css: function( key, value ) {
  30.153 +		return this.attr( key, value, "curCSS" );
  30.154 +	},
  30.155 +
  30.156 +	text: function(e) {
  30.157 +		if ( typeof e != "object" && e != null )
  30.158 +			return this.empty().append( document.createTextNode( e ) );
  30.159 +
  30.160 +		var t = "";
  30.161 +		jQuery.each( e || this, function(){
  30.162 +			jQuery.each( this.childNodes, function(){
  30.163 +				if ( this.nodeType != 8 )
  30.164 +					t += this.nodeType != 1 ?
  30.165 +						this.nodeValue : jQuery.fn.text([ this ]);
  30.166 +			});
  30.167 +		});
  30.168 +		return t;
  30.169 +	},
  30.170 +
  30.171 +	wrapAll: function(html) {
  30.172 +		if ( this[0] )
  30.173 +			// The elements to wrap the target around
  30.174 +			jQuery(html, this[0].ownerDocument)
  30.175 +				.clone()
  30.176 +				.insertBefore(this[0])
  30.177 +				.map(function(){
  30.178 +					var elem = this;
  30.179 +					while ( elem.firstChild )
  30.180 +						elem = elem.firstChild;
  30.181 +					return elem;
  30.182 +				})
  30.183 +				.append(this);
  30.184 +
  30.185 +		return this;
  30.186 +	},
  30.187 +
  30.188 +	wrapInner: function(html) {
  30.189 +		return this.each(function(){
  30.190 +			jQuery(this).contents().wrapAll(html);
  30.191 +		});
  30.192 +	},
  30.193 +
  30.194 +	wrap: function(html) {
  30.195 +		return this.each(function(){
  30.196 +			jQuery(this).wrapAll(html);
  30.197 +		});
  30.198 +	},
  30.199 +
  30.200 +	append: function() {
  30.201 +		return this.domManip(arguments, true, 1, function(a){
  30.202 +			this.appendChild( a );
  30.203 +		});
  30.204 +	},
  30.205 +
  30.206 +	prepend: function() {
  30.207 +		return this.domManip(arguments, true, -1, function(a){
  30.208 +			this.insertBefore( a, this.firstChild );
  30.209 +		});
  30.210 +	},
  30.211 +	
  30.212 +	before: function() {
  30.213 +		return this.domManip(arguments, false, 1, function(a){
  30.214 +			this.parentNode.insertBefore( a, this );
  30.215 +		});
  30.216 +	},
  30.217 +
  30.218 +	after: function() {
  30.219 +		return this.domManip(arguments, false, -1, function(a){
  30.220 +			this.parentNode.insertBefore( a, this.nextSibling );
  30.221 +		});
  30.222 +	},
  30.223 +
  30.224 +	end: function() {
  30.225 +		return this.prevObject || jQuery([]);
  30.226 +	},
  30.227 +
  30.228 +	find: function(t) {
  30.229 +		var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
  30.230 +		return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
  30.231 +			jQuery.unique( data ) : data );
  30.232 +	},
  30.233 +
  30.234 +	clone: function(events) {
  30.235 +		// Do the clone
  30.236 +		var ret = this.map(function(){
  30.237 +			return this.outerHTML ? jQuery(this.outerHTML)[0] : this.cloneNode(true);
  30.238 +		});
  30.239 +
  30.240 +		// Need to set the expando to null on the cloned set if it exists
  30.241 +		// removeData doesn't work here, IE removes it from the original as well
  30.242 +		// this is primarily for IE but the data expando shouldn't be copied over in any browser
  30.243 +		var clone = ret.find("*").andSelf().each(function(){
  30.244 +			if ( this[ expando ] != undefined )
  30.245 +				this[ expando ] = null;
  30.246 +		});
  30.247 +		
  30.248 +		// Copy the events from the original to the clone
  30.249 +		if (events === true)
  30.250 +			this.find("*").andSelf().each(function(i) {
  30.251 +				var events = jQuery.data(this, "events");
  30.252 +				for ( var type in events )
  30.253 +					for ( var handler in events[type] )
  30.254 +						jQuery.event.add(clone[i], type, events[type][handler], events[type][handler].data);
  30.255 +			});
  30.256 +
  30.257 +		// Return the cloned set
  30.258 +		return ret;
  30.259 +	},
  30.260 +
  30.261 +	filter: function(t) {
  30.262 +		return this.pushStack(
  30.263 +			jQuery.isFunction( t ) &&
  30.264 +			jQuery.grep(this, function(el, index){
  30.265 +				return t.apply(el, [index]);
  30.266 +			}) ||
  30.267 +
  30.268 +			jQuery.multiFilter(t,this) );
  30.269 +	},
  30.270 +
  30.271 +	not: function(t) {
  30.272 +		return this.pushStack(
  30.273 +			t.constructor == String &&
  30.274 +			jQuery.multiFilter(t, this, true) ||
  30.275 +
  30.276 +			jQuery.grep(this, function(a) {
  30.277 +				return ( t.constructor == Array || t.jquery )
  30.278 +					? jQuery.inArray( a, t ) < 0
  30.279 +					: a != t;
  30.280 +			})
  30.281 +		);
  30.282 +	},
  30.283 +
  30.284 +	add: function(t) {
  30.285 +		return this.pushStack( jQuery.merge(
  30.286 +			this.get(),
  30.287 +			t.constructor == String ?
  30.288 +				jQuery(t).get() :
  30.289 +				t.length != undefined && (!t.nodeName || jQuery.nodeName(t, "form")) ?
  30.290 +					t : [t] )
  30.291 +		);
  30.292 +	},
  30.293 +
  30.294 +	is: function(expr) {
  30.295 +		return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
  30.296 +	},
  30.297 +
  30.298 +	hasClass: function(expr) {
  30.299 +		return this.is("." + expr);
  30.300 +	},
  30.301 +	
  30.302 +	val: function( val ) {
  30.303 +		if ( val == undefined ) {
  30.304 +			if ( this.length ) {
  30.305 +				var elem = this[0];
  30.306 +		    	
  30.307 +				// We need to handle select boxes special
  30.308 +				if ( jQuery.nodeName(elem, "select") ) {
  30.309 +					var index = elem.selectedIndex,
  30.310 +						a = [],
  30.311 +						options = elem.options,
  30.312 +						one = elem.type == "select-one";
  30.313 +					
  30.314 +					// Nothing was selected
  30.315 +					if ( index < 0 )
  30.316 +						return null;
  30.317 +
  30.318 +					// Loop through all the selected options
  30.319 +					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
  30.320 +						var option = options[i];
  30.321 +						if ( option.selected ) {
  30.322 +							// Get the specifc value for the option
  30.323 +							var val = jQuery.browser.msie && !option.attributes["value"].specified ? option.text : option.value;
  30.324 +							
  30.325 +							// We don't need an array for one selects
  30.326 +							if ( one )
  30.327 +								return val;
  30.328 +							
  30.329 +							// Multi-Selects return an array
  30.330 +							a.push(val);
  30.331 +						}
  30.332 +					}
  30.333 +					
  30.334 +					return a;
  30.335 +					
  30.336 +				// Everything else, we just grab the value
  30.337 +				} else
  30.338 +					return this[0].value.replace(/\r/g, "");
  30.339 +			}
  30.340 +		} else
  30.341 +			return this.each(function(){
  30.342 +				if ( val.constructor == Array && /radio|checkbox/.test(this.type) )
  30.343 +					this.checked = (jQuery.inArray(this.value, val) >= 0 ||
  30.344 +						jQuery.inArray(this.name, val) >= 0);
  30.345 +				else if ( jQuery.nodeName(this, "select") ) {
  30.346 +					var tmp = val.constructor == Array ? val : [val];
  30.347 +
  30.348 +					jQuery("option", this).each(function(){
  30.349 +						this.selected = (jQuery.inArray(this.value, tmp) >= 0 ||
  30.350 +						jQuery.inArray(this.text, tmp) >= 0);
  30.351 +					});
  30.352 +
  30.353 +					if ( !tmp.length )
  30.354 +						this.selectedIndex = -1;
  30.355 +				} else
  30.356 +					this.value = val;
  30.357 +			});
  30.358 +	},
  30.359 +	
  30.360 +	html: function( val ) {
  30.361 +		return val == undefined ?
  30.362 +			( this.length ? this[0].innerHTML : null ) :
  30.363 +			this.empty().append( val );
  30.364 +	},
  30.365 +
  30.366 +	replaceWith: function( val ) {
  30.367 +		return this.after( val ).remove();
  30.368 +	},
  30.369 +
  30.370 +	eq: function(i){
  30.371 +		return this.slice(i, i+1);
  30.372 +	},
  30.373 +
  30.374 +	slice: function() {
  30.375 +		return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
  30.376 +	},
  30.377 +
  30.378 +	map: function(fn) {
  30.379 +		return this.pushStack(jQuery.map( this, function(elem,i){
  30.380 +			return fn.call( elem, i, elem );
  30.381 +		}));
  30.382 +	},
  30.383 +
  30.384 +	andSelf: function() {
  30.385 +		return this.add( this.prevObject );
  30.386 +	},
  30.387 +	
  30.388 +	domManip: function(args, table, dir, fn) {
  30.389 +		var clone = this.length > 1, a; 
  30.390 +
  30.391 +		return this.each(function(){
  30.392 +			if ( !a ) {
  30.393 +				a = jQuery.clean(args, this.ownerDocument);
  30.394 +				if ( dir < 0 )
  30.395 +					a.reverse();
  30.396 +			}
  30.397 +
  30.398 +			var obj = this;
  30.399 +
  30.400 +			if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
  30.401 +				obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
  30.402 +
  30.403 +			jQuery.each( a, function(){
  30.404 +				var elem = clone ? this.cloneNode(true) : this;
  30.405 +				if ( !evalScript(0, elem) )
  30.406 +					fn.call( obj, elem );
  30.407 +			});
  30.408 +		});
  30.409 +	}
  30.410 +};
  30.411 +
  30.412 +function evalScript(i, elem){
  30.413 +	var script = jQuery.nodeName(elem, "script");
  30.414 +
  30.415 +	if ( script ) {
  30.416 +		if ( elem.src )
  30.417 +			jQuery.ajax({ url: elem.src, async: false, dataType: "script" });
  30.418 +		else
  30.419 +			jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
  30.420 +	
  30.421 +		if ( elem.parentNode )
  30.422 +			elem.parentNode.removeChild(elem);
  30.423 +
  30.424 +	} else if ( elem.nodeType == 1 )
  30.425 +    jQuery("script", elem).each(evalScript);
  30.426 +
  30.427 +	return script;
  30.428 +}
  30.429 +
  30.430 +jQuery.extend = jQuery.fn.extend = function() {
  30.431 +	// copy reference to target object
  30.432 +	var target = arguments[0] || {}, a = 1, al = arguments.length, deep = false;
  30.433 +
  30.434 +	// Handle a deep copy situation
  30.435 +	if ( target.constructor == Boolean ) {
  30.436 +		deep = target;
  30.437 +		target = arguments[1] || {};
  30.438 +	}
  30.439 +
  30.440 +	// extend jQuery itself if only one argument is passed
  30.441 +	if ( al == 1 ) {
  30.442 +		target = this;
  30.443 +		a = 0;
  30.444 +	}
  30.445 +
  30.446 +	var prop;
  30.447 +
  30.448 +	for ( ; a < al; a++ )
  30.449 +		// Only deal with non-null/undefined values
  30.450 +		if ( (prop = arguments[a]) != null )
  30.451 +			// Extend the base object
  30.452 +			for ( var i in prop ) {
  30.453 +				// Prevent never-ending loop
  30.454 +				if ( target == prop[i] )
  30.455 +					continue;
  30.456 +
  30.457 +				// Recurse if we're merging object values
  30.458 +				if ( deep && typeof prop[i] == 'object' && target[i] )
  30.459 +					jQuery.extend( target[i], prop[i] );
  30.460 +
  30.461 +				// Don't bring in undefined values
  30.462 +				else if ( prop[i] != undefined )
  30.463 +					target[i] = prop[i];
  30.464 +			}
  30.465 +
  30.466 +	// Return the modified object
  30.467 +	return target;
  30.468 +};
  30.469 +
  30.470 +var expando = "jQuery" + (new Date()).getTime(), uuid = 0, win = {};
  30.471 +
  30.472 +jQuery.extend({
  30.473 +	noConflict: function(deep) {
  30.474 +		window.$ = _$;
  30.475 +		if ( deep )
  30.476 +			window.jQuery = _jQuery;
  30.477 +		return jQuery;
  30.478 +	},
  30.479 +
  30.480 +	// This may seem like some crazy code, but trust me when I say that this
  30.481 +	// is the only cross-browser way to do this. --John
  30.482 +	isFunction: function( fn ) {
  30.483 +		return !!fn && typeof fn != "string" && !fn.nodeName && 
  30.484 +			fn.constructor != Array && /function/i.test( fn + "" );
  30.485 +	},
  30.486 +	
  30.487 +	// check if an element is in a XML document
  30.488 +	isXMLDoc: function(elem) {
  30.489 +		return elem.documentElement && !elem.body ||
  30.490 +			elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
  30.491 +	},
  30.492 +
  30.493 +	// Evalulates a script in a global context
  30.494 +	// Evaluates Async. in Safari 2 :-(
  30.495 +	globalEval: function( data ) {
  30.496 +		data = jQuery.trim( data );
  30.497 +		if ( data ) {
  30.498 +			if ( window.execScript )
  30.499 +				window.execScript( data );
  30.500 +			else if ( jQuery.browser.safari )
  30.501 +				// safari doesn't provide a synchronous global eval
  30.502 +				window.setTimeout( data, 0 );
  30.503 +			else
  30.504 +				eval.call( window, data );
  30.505 +		}
  30.506 +	},
  30.507 +
  30.508 +	nodeName: function( elem, name ) {
  30.509 +		return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
  30.510 +	},
  30.511 +	
  30.512 +	cache: {},
  30.513 +	
  30.514 +	data: function( elem, name, data ) {
  30.515 +		elem = elem == window ? win : elem;
  30.516 +
  30.517 +		var id = elem[ expando ];
  30.518 +
  30.519 +		// Compute a unique ID for the element
  30.520 +		if ( !id ) 
  30.521 +			id = elem[ expando ] = ++uuid;
  30.522 +
  30.523 +		// Only generate the data cache if we're
  30.524 +		// trying to access or manipulate it
  30.525 +		if ( name && !jQuery.cache[ id ] )
  30.526 +			jQuery.cache[ id ] = {};
  30.527 +		
  30.528 +		// Prevent overriding the named cache with undefined values
  30.529 +		if ( data != undefined )
  30.530 +			jQuery.cache[ id ][ name ] = data;
  30.531 +		
  30.532 +		// Return the named cache data, or the ID for the element	
  30.533 +		return name ? jQuery.cache[ id ][ name ] : id;
  30.534 +	},
  30.535 +	
  30.536 +	removeData: function( elem, name ) {
  30.537 +		elem = elem == window ? win : elem;
  30.538 +
  30.539 +		var id = elem[ expando ];
  30.540 +
  30.541 +		// If we want to remove a specific section of the element's data
  30.542 +		if ( name ) {
  30.543 +			if ( jQuery.cache[ id ] ) {
  30.544 +				// Remove the section of cache data
  30.545 +				delete jQuery.cache[ id ][ name ];
  30.546 +
  30.547 +				// If we've removed all the data, remove the element's cache
  30.548 +				name = "";
  30.549 +				for ( name in jQuery.cache[ id ] ) break;
  30.550 +				if ( !name )
  30.551 +					jQuery.removeData( elem );
  30.552 +			}
  30.553 +
  30.554 +		// Otherwise, we want to remove all of the element's data
  30.555 +		} else {
  30.556 +			// Clean up the element expando
  30.557 +			try {
  30.558 +				delete elem[ expando ];
  30.559 +			} catch(e){
  30.560 +				// IE has trouble directly removing the expando
  30.561 +				// but it's ok with using removeAttribute
  30.562 +				if ( elem.removeAttribute )
  30.563 +					elem.removeAttribute( expando );
  30.564 +			}
  30.565 +
  30.566 +			// Completely remove the data cache
  30.567 +			delete jQuery.cache[ id ];
  30.568 +		}
  30.569 +	},
  30.570 +
  30.571 +	// args is for internal usage only
  30.572 +	each: function( obj, fn, args ) {
  30.573 +		if ( args ) {
  30.574 +			if ( obj.length == undefined )
  30.575 +				for ( var i in obj )
  30.576 +					fn.apply( obj[i], args );
  30.577 +			else
  30.578 +				for ( var i = 0, ol = obj.length; i < ol; i++ )
  30.579 +					if ( fn.apply( obj[i], args ) === false ) break;
  30.580 +
  30.581 +		// A special, fast, case for the most common use of each
  30.582 +		} else {
  30.583 +			if ( obj.length == undefined )
  30.584 +				for ( var i in obj )
  30.585 +					fn.call( obj[i], i, obj[i] );
  30.586 +			else
  30.587 +				for ( var i = 0, ol = obj.length, val = obj[0]; 
  30.588 +					i < ol && fn.call(val,i,val) !== false; val = obj[++i] ){}
  30.589 +		}
  30.590 +
  30.591 +		return obj;
  30.592 +	},
  30.593 +	
  30.594 +	prop: function(elem, value, type, index, prop){
  30.595 +			// Handle executable functions
  30.596 +			if ( jQuery.isFunction( value ) )
  30.597 +				value = value.call( elem, [index] );
  30.598 +				
  30.599 +			// exclude the following css properties to add px
  30.600 +			var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
  30.601 +
  30.602 +			// Handle passing in a number to a CSS property
  30.603 +			return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
  30.604 +				value + "px" :
  30.605 +				value;
  30.606 +	},
  30.607 +
  30.608 +	className: {
  30.609 +		// internal only, use addClass("class")
  30.610 +		add: function( elem, c ){
  30.611 +			jQuery.each( (c || "").split(/\s+/), function(i, cur){
  30.612 +				if ( !jQuery.className.has( elem.className, cur ) )
  30.613 +					elem.className += ( elem.className ? " " : "" ) + cur;
  30.614 +			});
  30.615 +		},
  30.616 +
  30.617 +		// internal only, use removeClass("class")
  30.618 +		remove: function( elem, c ){
  30.619 +			elem.className = c != undefined ?
  30.620 +				jQuery.grep( elem.className.split(/\s+/), function(cur){
  30.621 +					return !jQuery.className.has( c, cur );	
  30.622 +				}).join(" ") : "";
  30.623 +		},
  30.624 +
  30.625 +		// internal only, use is(".class")
  30.626 +		has: function( t, c ) {
  30.627 +			return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
  30.628 +		}
  30.629 +	},
  30.630 +
  30.631 +	swap: function(e,o,f) {
  30.632 +		for ( var i in o ) {
  30.633 +			e.style["old"+i] = e.style[i];
  30.634 +			e.style[i] = o[i];
  30.635 +		}
  30.636 +		f.apply( e, [] );
  30.637 +		for ( var i in o )
  30.638 +			e.style[i] = e.style["old"+i];
  30.639 +	},
  30.640 +
  30.641 +	css: function(e,p) {
  30.642 +		if ( p == "height" || p == "width" ) {
  30.643 +			var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
  30.644 +
  30.645 +			jQuery.each( d, function(){
  30.646 +				old["padding" + this] = 0;
  30.647 +				old["border" + this + "Width"] = 0;
  30.648 +			});
  30.649 +
  30.650 +			jQuery.swap( e, old, function() {
  30.651 +				if ( jQuery(e).is(':visible') ) {
  30.652 +					oHeight = e.offsetHeight;
  30.653 +					oWidth = e.offsetWidth;
  30.654 +				} else {
  30.655 +					e = jQuery(e.cloneNode(true))
  30.656 +						.find(":radio").removeAttr("checked").end()
  30.657 +						.css({
  30.658 +							visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
  30.659 +						}).appendTo(e.parentNode)[0];
  30.660 +
  30.661 +					var parPos = jQuery.css(e.parentNode,"position") || "static";
  30.662 +					if ( parPos == "static" )
  30.663 +						e.parentNode.style.position = "relative";
  30.664 +
  30.665 +					oHeight = e.clientHeight;
  30.666 +					oWidth = e.clientWidth;
  30.667 +
  30.668 +					if ( parPos == "static" )
  30.669 +						e.parentNode.style.position = "static";
  30.670 +
  30.671 +					e.parentNode.removeChild(e);
  30.672 +				}
  30.673 +			});
  30.674 +
  30.675 +			return p == "height" ? oHeight : oWidth;
  30.676 +		}
  30.677 +
  30.678 +		return jQuery.curCSS( e, p );
  30.679 +	},
  30.680 +
  30.681 +	curCSS: function(elem, prop, force) {
  30.682 +		var ret, stack = [], swap = [];
  30.683 +
  30.684 +		// A helper method for determining if an element's values are broken
  30.685 +		function color(a){
  30.686 +			if ( !jQuery.browser.safari )
  30.687 +				return false;
  30.688 +
  30.689 +			var ret = document.defaultView.getComputedStyle(a,null);
  30.690 +			return !ret || ret.getPropertyValue("color") == "";
  30.691 +		}
  30.692 +
  30.693 +		if (prop == "opacity" && jQuery.browser.msie) {
  30.694 +			ret = jQuery.attr(elem.style, "opacity");
  30.695 +			return ret == "" ? "1" : ret;
  30.696 +		}
  30.697 +		
  30.698 +		if (prop.match(/float/i))
  30.699 +			prop = styleFloat;
  30.700 +
  30.701 +		if (!force && elem.style[prop])
  30.702 +			ret = elem.style[prop];
  30.703 +
  30.704 +		else if (document.defaultView && document.defaultView.getComputedStyle) {
  30.705 +
  30.706 +			if (prop.match(/float/i))
  30.707 +				prop = "float";
  30.708 +
  30.709 +			prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
  30.710 +			var cur = document.defaultView.getComputedStyle(elem, null);
  30.711 +
  30.712 +			if ( cur && !color(elem) )
  30.713 +				ret = cur.getPropertyValue(prop);
  30.714 +
  30.715 +			// If the element isn't reporting its values properly in Safari
  30.716 +			// then some display: none elements are involved
  30.717 +			else {
  30.718 +				// Locate all of the parent display: none elements
  30.719 +				for ( var a = elem; a && color(a); a = a.parentNode )
  30.720 +					stack.unshift(a);
  30.721 +
  30.722 +				// Go through and make them visible, but in reverse
  30.723 +				// (It would be better if we knew the exact display type that they had)
  30.724 +				for ( a = 0; a < stack.length; a++ )
  30.725 +					if ( color(stack[a]) ) {
  30.726 +						swap[a] = stack[a].style.display;
  30.727 +						stack[a].style.display = "block";
  30.728 +					}
  30.729 +
  30.730 +				// Since we flip the display style, we have to handle that
  30.731 +				// one special, otherwise get the value
  30.732 +				ret = prop == "display" && swap[stack.length-1] != null ?
  30.733 +					"none" :
  30.734 +					document.defaultView.getComputedStyle(elem,null).getPropertyValue(prop) || "";
  30.735 +
  30.736 +				// Finally, revert the display styles back
  30.737 +				for ( a = 0; a < swap.length; a++ )
  30.738 +					if ( swap[a] != null )
  30.739 +						stack[a].style.display = swap[a];
  30.740 +			}
  30.741 +
  30.742 +			if ( prop == "opacity" && ret == "" )
  30.743 +				ret = "1";
  30.744 +
  30.745 +		} else if (elem.currentStyle) {
  30.746 +			var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
  30.747 +			ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
  30.748 +
  30.749 +			// From the awesome hack by Dean Edwards
  30.750 +			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
  30.751 +
  30.752 +			// If we're not dealing with a regular pixel number
  30.753 +			// but a number that has a weird ending, we need to convert it to pixels
  30.754 +			if ( !/^\d+(px)?$/i.test(ret) && /^\d/.test(ret) ) {
  30.755 +				var style = elem.style.left;
  30.756 +				var runtimeStyle = elem.runtimeStyle.left;
  30.757 +				elem.runtimeStyle.left = elem.currentStyle.left;
  30.758 +				elem.style.left = ret || 0;
  30.759 +				ret = elem.style.pixelLeft + "px";
  30.760 +				elem.style.left = style;
  30.761 +				elem.runtimeStyle.left = runtimeStyle;
  30.762 +			}
  30.763 +		}
  30.764 +
  30.765 +		return ret;
  30.766 +	},
  30.767 +	
  30.768 +	clean: function(a, doc) {
  30.769 +		var r = [];
  30.770 +		doc = doc || document;
  30.771 +
  30.772 +		jQuery.each( a, function(i,arg){
  30.773 +			if ( !arg ) return;
  30.774 +
  30.775 +			if ( arg.constructor == Number )
  30.776 +				arg = arg.toString();
  30.777 +			
  30.778 +			// Convert html string into DOM nodes
  30.779 +			if ( typeof arg == "string" ) {
  30.780 +				// Fix "XHTML"-style tags in all browsers
  30.781 +				arg = arg.replace(/(<(\w+)[^>]*?)\/>/g, function(m, all, tag){
  30.782 +					return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area)$/i)? m : all+"></"+tag+">";
  30.783 +				});
  30.784 +
  30.785 +				// Trim whitespace, otherwise indexOf won't work as expected
  30.786 +				var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
  30.787 +
  30.788 +				var wrap =
  30.789 +					// option or optgroup
  30.790 +					!s.indexOf("<opt") &&
  30.791 +					[1, "<select>", "</select>"] ||
  30.792 +					
  30.793 +					!s.indexOf("<leg") &&
  30.794 +					[1, "<fieldset>", "</fieldset>"] ||
  30.795 +					
  30.796 +					s.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
  30.797 +					[1, "<table>", "</table>"] ||
  30.798 +					
  30.799 +					!s.indexOf("<tr") &&
  30.800 +					[2, "<table><tbody>", "</tbody></table>"] ||
  30.801 +					
  30.802 +				 	// <thead> matched above
  30.803 +					(!s.indexOf("<td") || !s.indexOf("<th")) &&
  30.804 +					[3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
  30.805 +					
  30.806 +					!s.indexOf("<col") &&
  30.807 +					[2, "<table><tbody></tbody><colgroup>", "</colgroup></table>"] ||
  30.808 +
  30.809 +					// IE can't serialize <link> and <script> tags normally
  30.810 +					jQuery.browser.msie &&
  30.811 +					[1, "div<div>", "</div>"] ||
  30.812 +					
  30.813 +					[0,"",""];
  30.814 +
  30.815 +				// Go to html and back, then peel off extra wrappers
  30.816 +				div.innerHTML = wrap[1] + arg + wrap[2];
  30.817 +				
  30.818 +				// Move to the right depth
  30.819 +				while ( wrap[0]-- )
  30.820 +					div = div.lastChild;
  30.821 +				
  30.822 +				// Remove IE's autoinserted <tbody> from table fragments
  30.823 +				if ( jQuery.browser.msie ) {
  30.824 +					
  30.825 +					// String was a <table>, *may* have spurious <tbody>
  30.826 +					if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 ) 
  30.827 +						tb = div.firstChild && div.firstChild.childNodes;
  30.828 +						
  30.829 +					// String was a bare <thead> or <tfoot>
  30.830 +					else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
  30.831 +						tb = div.childNodes;
  30.832 +
  30.833 +					for ( var n = tb.length-1; n >= 0 ; --n )
  30.834 +						if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
  30.835 +							tb[n].parentNode.removeChild(tb[n]);
  30.836 +	
  30.837 +					// IE completely kills leading whitespace when innerHTML is used	
  30.838 +					if ( /^\s/.test(arg) )	
  30.839 +						div.insertBefore( doc.createTextNode( arg.match(/^\s*/)[0] ), div.firstChild );
  30.840 +
  30.841 +				}
  30.842 +				
  30.843 +				arg = jQuery.makeArray( div.childNodes );
  30.844 +			}
  30.845 +
  30.846 +			if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
  30.847 +				return;
  30.848 +
  30.849 +			if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
  30.850 +				r.push( arg );
  30.851 +			else
  30.852 +				r = jQuery.merge( r, arg );
  30.853 +
  30.854 +		});
  30.855 +
  30.856 +		return r;
  30.857 +	},
  30.858 +	
  30.859 +	attr: function(elem, name, value){
  30.860 +		var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
  30.861 +
  30.862 +		// Safari mis-reports the default selected property of a hidden option
  30.863 +		// Accessing the parent's selectedIndex property fixes it
  30.864 +		if ( name == "selected" && jQuery.browser.safari )
  30.865 +			elem.parentNode.selectedIndex;
  30.866 +		
  30.867 +		// Certain attributes only work when accessed via the old DOM 0 way
  30.868 +		if ( fix[name] ) {
  30.869 +			if ( value != undefined ) elem[fix[name]] = value;
  30.870 +			return elem[fix[name]];
  30.871 +		} else if ( jQuery.browser.msie && name == "style" )
  30.872 +			return jQuery.attr( elem.style, "cssText", value );
  30.873 +
  30.874 +		else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
  30.875 +			return elem.getAttributeNode(name).nodeValue;
  30.876 +
  30.877 +		// IE elem.getAttribute passes even for style
  30.878 +		else if ( elem.tagName ) {
  30.879 +
  30.880 +			if ( value != undefined ) {
  30.881 +				if ( name == "type" && jQuery.nodeName(elem,"input") && elem.parentNode )
  30.882 +					throw "type property can't be changed";
  30.883 +				elem.setAttribute( name, value );
  30.884 +			}
  30.885 +
  30.886 +			if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) ) 
  30.887 +				return elem.getAttribute( name, 2 );
  30.888 +
  30.889 +			return elem.getAttribute( name );
  30.890 +
  30.891 +		// elem is actually elem.style ... set the style
  30.892 +		} else {
  30.893 +			// IE actually uses filters for opacity
  30.894 +			if ( name == "opacity" && jQuery.browser.msie ) {
  30.895 +				if ( value != undefined ) {
  30.896 +					// IE has trouble with opacity if it does not have layout
  30.897 +					// Force it by setting the zoom level
  30.898 +					elem.zoom = 1; 
  30.899 +	
  30.900 +					// Set the alpha filter to set the opacity
  30.901 +					elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
  30.902 +						(parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
  30.903 +				}
  30.904 +	
  30.905 +				return elem.filter ? 
  30.906 +					(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
  30.907 +			}
  30.908 +			name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
  30.909 +			if ( value != undefined ) elem[name] = value;
  30.910 +			return elem[name];
  30.911 +		}
  30.912 +	},
  30.913 +	
  30.914 +	trim: function(t){
  30.915 +		return (t||"").replace(/^\s+|\s+$/g, "");
  30.916 +	},
  30.917 +
  30.918 +	makeArray: function( a ) {
  30.919 +		var r = [];
  30.920 +
  30.921 +		// Need to use typeof to fight Safari childNodes crashes
  30.922 +		if ( typeof a != "array" )
  30.923 +			for ( var i = 0, al = a.length; i < al; i++ )
  30.924 +				r.push( a[i] );
  30.925 +		else
  30.926 +			r = a.slice( 0 );
  30.927 +
  30.928 +		return r;
  30.929 +	},
  30.930 +
  30.931 +	inArray: function( b, a ) {
  30.932 +		for ( var i = 0, al = a.length; i < al; i++ )
  30.933 +			if ( a[i] == b )
  30.934 +				return i;
  30.935 +		return -1;
  30.936 +	},
  30.937 +
  30.938 +	merge: function(first, second) {
  30.939 +		// We have to loop this way because IE & Opera overwrite the length
  30.940 +		// expando of getElementsByTagName
  30.941 +
  30.942 +		// Also, we need to make sure that the correct elements are being returned
  30.943 +		// (IE returns comment nodes in a '*' query)
  30.944 +		if ( jQuery.browser.msie ) {
  30.945 +			for ( var i = 0; second[i]; i++ )
  30.946 +				if ( second[i].nodeType != 8 )
  30.947 +					first.push(second[i]);
  30.948 +		} else
  30.949 +			for ( var i = 0; second[i]; i++ )
  30.950 +				first.push(second[i]);
  30.951 +
  30.952 +		return first;
  30.953 +	},
  30.954 +
  30.955 +	unique: function(first) {
  30.956 +		var r = [], done = {};
  30.957 +
  30.958 +		try {
  30.959 +			for ( var i = 0, fl = first.length; i < fl; i++ ) {
  30.960 +				var id = jQuery.data(first[i]);
  30.961 +				if ( !done[id] ) {
  30.962 +					done[id] = true;
  30.963 +					r.push(first[i]);
  30.964 +				}
  30.965 +			}
  30.966 +		} catch(e) {
  30.967 +			r = first;
  30.968 +		}
  30.969 +
  30.970 +		return r;
  30.971 +	},
  30.972 +
  30.973 +	grep: function(elems, fn, inv) {
  30.974 +		// If a string is passed in for the function, make a function
  30.975 +		// for it (a handy shortcut)
  30.976 +		if ( typeof fn == "string" )
  30.977 +			fn = eval("false||function(a,i){return " + fn + "}");
  30.978 +
  30.979 +		var result = [];
  30.980 +
  30.981 +		// Go through the array, only saving the items
  30.982 +		// that pass the validator function
  30.983 +		for ( var i = 0, el = elems.length; i < el; i++ )
  30.984 +			if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
  30.985 +				result.push( elems[i] );
  30.986 +
  30.987 +		return result;
  30.988 +	},
  30.989 +
  30.990 +	map: function(elems, fn) {
  30.991 +		// If a string is passed in for the function, make a function
  30.992 +		// for it (a handy shortcut)
  30.993 +		if ( typeof fn == "string" )
  30.994 +			fn = eval("false||function(a){return " + fn + "}");
  30.995 +
  30.996 +		var result = [];
  30.997 +
  30.998 +		// Go through the array, translating each of the items to their
  30.999 +		// new value (or values).
 30.1000 +		for ( var i = 0, el = elems.length; i < el; i++ ) {
 30.1001 +			var val = fn(elems[i],i);
 30.1002 +
 30.1003 +			if ( val !== null && val != undefined ) {
 30.1004 +				if ( val.constructor != Array ) val = [val];
 30.1005 +				result = result.concat( val );
 30.1006 +			}
 30.1007 +		}
 30.1008 +
 30.1009 +		return result;
 30.1010 +	}
 30.1011 +});
 30.1012 +
 30.1013 +var userAgent = navigator.userAgent.toLowerCase();
 30.1014 +
 30.1015 +// Figure out what browser is being used
 30.1016 +jQuery.browser = {
 30.1017 +	version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
 30.1018 +	safari: /webkit/.test(userAgent),
 30.1019 +	opera: /opera/.test(userAgent),
 30.1020 +	msie: /msie/.test(userAgent) && !/opera/.test(userAgent),
 30.1021 +	mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent)
 30.1022 +};
 30.1023 +
 30.1024 +var styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat";
 30.1025 +	
 30.1026 +jQuery.extend({
 30.1027 +	// Check to see if the W3C box model is being used
 30.1028 +	boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 30.1029 +	
 30.1030 +	styleFloat: jQuery.browser.msie ? "styleFloat" : "cssFloat",
 30.1031 +	
 30.1032 +	props: {
 30.1033 +		"for": "htmlFor",
 30.1034 +		"class": "className",
 30.1035 +		"float": styleFloat,
 30.1036 +		cssFloat: styleFloat,
 30.1037 +		styleFloat: styleFloat,
 30.1038 +		innerHTML: "innerHTML",
 30.1039 +		className: "className",
 30.1040 +		value: "value",
 30.1041 +		disabled: "disabled",
 30.1042 +		checked: "checked",
 30.1043 +		readonly: "readOnly",
 30.1044 +		selected: "selected",
 30.1045 +		maxlength: "maxLength"
 30.1046 +	}
 30.1047 +});
 30.1048 +
 30.1049 +jQuery.each({
 30.1050 +	parent: "a.parentNode",
 30.1051 +	parents: "jQuery.dir(a,'parentNode')",
 30.1052 +	next: "jQuery.nth(a,2,'nextSibling')",
 30.1053 +	prev: "jQuery.nth(a,2,'previousSibling')",
 30.1054 +	nextAll: "jQuery.dir(a,'nextSibling')",
 30.1055 +	prevAll: "jQuery.dir(a,'previousSibling')",
 30.1056 +	siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
 30.1057 +	children: "jQuery.sibling(a.firstChild)",
 30.1058 +	contents: "jQuery.nodeName(a,'iframe')?a.contentDocument||a.contentWindow.document:jQuery.makeArray(a.childNodes)"
 30.1059 +}, function(i,n){
 30.1060 +	jQuery.fn[ i ] = function(a) {
 30.1061 +		var ret = jQuery.map(this,n);
 30.1062 +		if ( a && typeof a == "string" )
 30.1063 +			ret = jQuery.multiFilter(a,ret);
 30.1064 +		return this.pushStack( jQuery.unique(ret) );
 30.1065 +	};
 30.1066 +});
 30.1067 +
 30.1068 +jQuery.each({
 30.1069 +	appendTo: "append",
 30.1070 +	prependTo: "prepend",
 30.1071 +	insertBefore: "before",
 30.1072 +	insertAfter: "after",
 30.1073 +	replaceAll: "replaceWith"
 30.1074 +}, function(i,n){
 30.1075 +	jQuery.fn[ i ] = function(){
 30.1076 +		var a = arguments;
 30.1077 +		return this.each(function(){
 30.1078 +			for ( var j = 0, al = a.length; j < al; j++ )
 30.1079 +				jQuery(a[j])[n]( this );
 30.1080 +		});
 30.1081 +	};
 30.1082 +});
 30.1083 +
 30.1084 +jQuery.each( {
 30.1085 +	removeAttr: function( key ) {
 30.1086 +		jQuery.attr( this, key, "" );
 30.1087 +		this.removeAttribute( key );
 30.1088 +	},
 30.1089 +	addClass: function(c){
 30.1090 +		jQuery.className.add(this,c);
 30.1091 +	},
 30.1092 +	removeClass: function(c){
 30.1093 +		jQuery.className.remove(this,c);
 30.1094 +	},
 30.1095 +	toggleClass: function( c ){
 30.1096 +		jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
 30.1097 +	},
 30.1098 +	remove: function(a){
 30.1099 +		if ( !a || jQuery.filter( a, [this] ).r.length ) {
 30.1100 +			jQuery.removeData( this );
 30.1101 +			this.parentNode.removeChild( this );
 30.1102 +		}
 30.1103 +	},
 30.1104 +	empty: function() {
 30.1105 +		// Clean up the cache
 30.1106 +		jQuery("*", this).each(function(){ jQuery.removeData(this); });
 30.1107 +
 30.1108 +		while ( this.firstChild )
 30.1109 +			this.removeChild( this.firstChild );
 30.1110 +	}
 30.1111 +}, function(i,n){
 30.1112 +	jQuery.fn[ i ] = function() {
 30.1113 +		return this.each( n, arguments );
 30.1114 +	};
 30.1115 +});
 30.1116 +
 30.1117 +jQuery.each( [ "Height", "Width" ], function(i,name){
 30.1118 +	var n = name.toLowerCase();
 30.1119 +	
 30.1120 +	jQuery.fn[ n ] = function(h) {
 30.1121 +		return this[0] == window ?
 30.1122 +			jQuery.browser.safari && self["inner" + name] ||
 30.1123 +			jQuery.boxModel && Math.max(document.documentElement["client" + name], document.body["client" + name]) ||
 30.1124 +			document.body["client" + name] :
 30.1125 +		
 30.1126 +			this[0] == document ?
 30.1127 +				Math.max( document.body["scroll" + name], document.body["offset" + name] ) :
 30.1128 +        
 30.1129 +				h == undefined ?
 30.1130 +					( this.length ? jQuery.css( this[0], n ) : null ) :
 30.1131 +					this.css( n, h.constructor == String ? h : h + "px" );
 30.1132 +	};
 30.1133 +});
 30.1134 +
 30.1135 +var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
 30.1136 +		"(?:[\\w*_-]|\\\\.)" :
 30.1137 +		"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
 30.1138 +	quickChild = new RegExp("^>\\s*(" + chars + "+)"),
 30.1139 +	quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
 30.1140 +	quickClass = new RegExp("^([#.]?)(" + chars + "*)");
 30.1141 +
 30.1142 +jQuery.extend({
 30.1143 +	expr: {
 30.1144 +		"": "m[2]=='*'||jQuery.nodeName(a,m[2])",
 30.1145 +		"#": "a.getAttribute('id')==m[2]",
 30.1146 +		":": {
 30.1147 +			// Position Checks
 30.1148 +			lt: "i<m[3]-0",
 30.1149 +			gt: "i>m[3]-0",
 30.1150 +			nth: "m[3]-0==i",
 30.1151 +			eq: "m[3]-0==i",
 30.1152 +			first: "i==0",
 30.1153 +			last: "i==r.length-1",
 30.1154 +			even: "i%2==0",
 30.1155 +			odd: "i%2",
 30.1156 +
 30.1157 +			// Child Checks
 30.1158 +			"first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
 30.1159 +			"last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
 30.1160 +			"only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
 30.1161 +
 30.1162 +			// Parent Checks
 30.1163 +			parent: "a.firstChild",
 30.1164 +			empty: "!a.firstChild",
 30.1165 +
 30.1166 +			// Text Check
 30.1167 +			contains: "(a.textContent||a.innerText||jQuery(a).text()||'').indexOf(m[3])>=0",
 30.1168 +
 30.1169 +			// Visibility
 30.1170 +			visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
 30.1171 +			hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
 30.1172 +
 30.1173 +			// Form attributes
 30.1174 +			enabled: "!a.disabled",
 30.1175 +			disabled: "a.disabled",
 30.1176 +			checked: "a.checked",
 30.1177 +			selected: "a.selected||jQuery.attr(a,'selected')",
 30.1178 +
 30.1179 +			// Form elements
 30.1180 +			text: "'text'==a.type",
 30.1181 +			radio: "'radio'==a.type",
 30.1182 +			checkbox: "'checkbox'==a.type",
 30.1183 +			file: "'file'==a.type",
 30.1184 +			password: "'password'==a.type",
 30.1185 +			submit: "'submit'==a.type",
 30.1186 +			image: "'image'==a.type",
 30.1187 +			reset: "'reset'==a.type",
 30.1188 +			button: '"button"==a.type||jQuery.nodeName(a,"button")',
 30.1189 +			input: "/input|select|textarea|button/i.test(a.nodeName)",
 30.1190 +
 30.1191 +			// :has()
 30.1192 +			has: "jQuery.find(m[3],a).length",
 30.1193 +
 30.1194 +			// :header
 30.1195 +			header: "/h\\d/i.test(a.nodeName)",
 30.1196 +
 30.1197 +			// :animated
 30.1198 +			animated: "jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length"
 30.1199 +		}
 30.1200 +	},
 30.1201 +	
 30.1202 +	// The regular expressions that power the parsing engine
 30.1203 +	parse: [
 30.1204 +		// Match: [@value='test'], [@foo]
 30.1205 +		/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 30.1206 +
 30.1207 +		// Match: :contains('foo')
 30.1208 +		/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 30.1209 +
 30.1210 +		// Match: :even, :last-chlid, #id, .class
 30.1211 +		new RegExp("^([:.#]*)(" + chars + "+)")
 30.1212 +	],
 30.1213 +
 30.1214 +	multiFilter: function( expr, elems, not ) {
 30.1215 +		var old, cur = [];
 30.1216 +
 30.1217 +		while ( expr && expr != old ) {
 30.1218 +			old = expr;
 30.1219 +			var f = jQuery.filter( expr, elems, not );
 30.1220 +			expr = f.t.replace(/^\s*,\s*/, "" );
 30.1221 +			cur = not ? elems = f.r : jQuery.merge( cur, f.r );
 30.1222 +		}
 30.1223 +
 30.1224 +		return cur;
 30.1225 +	},
 30.1226 +
 30.1227 +	find: function( t, context ) {
 30.1228 +		// Quickly handle non-string expressions
 30.1229 +		if ( typeof t != "string" )
 30.1230 +			return [ t ];
 30.1231 +
 30.1232 +		// Make sure that the context is a DOM Element
 30.1233 +		if ( context && !context.nodeType )
 30.1234 +			context = null;
 30.1235 +
 30.1236 +		// Set the correct context (if none is provided)
 30.1237 +		context = context || document;
 30.1238 +
 30.1239 +		// Initialize the search
 30.1240 +		var ret = [context], done = [], last;
 30.1241 +
 30.1242 +		// Continue while a selector expression exists, and while
 30.1243 +		// we're no longer looping upon ourselves
 30.1244 +		while ( t && last != t ) {
 30.1245 +			var r = [];
 30.1246 +			last = t;
 30.1247 +
 30.1248 +			t = jQuery.trim(t);
 30.1249 +
 30.1250 +			var foundToken = false;
 30.1251 +
 30.1252 +			// An attempt at speeding up child selectors that
 30.1253 +			// point to a specific element tag
 30.1254 +			var re = quickChild;
 30.1255 +			var m = re.exec(t);
 30.1256 +
 30.1257 +			if ( m ) {
 30.1258 +				var nodeName = m[1].toUpperCase();
 30.1259 +
 30.1260 +				// Perform our own iteration and filter
 30.1261 +				for ( var i = 0; ret[i]; i++ )
 30.1262 +					for ( var c = ret[i].firstChild; c; c = c.nextSibling )
 30.1263 +						if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
 30.1264 +							r.push( c );
 30.1265 +
 30.1266 +				ret = r;
 30.1267 +				t = t.replace( re, "" );
 30.1268 +				if ( t.indexOf(" ") == 0 ) continue;
 30.1269 +				foundToken = true;
 30.1270 +			} else {
 30.1271 +				re = /^([>+~])\s*(\w*)/i;
 30.1272 +
 30.1273 +				if ( (m = re.exec(t)) != null ) {
 30.1274 +					r = [];
 30.1275 +
 30.1276 +					var nodeName = m[2], merge = {};
 30.1277 +					m = m[1];
 30.1278 +
 30.1279 +					for ( var j = 0, rl = ret.length; j < rl; j++ ) {
 30.1280 +						var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
 30.1281 +						for ( ; n; n = n.nextSibling )
 30.1282 +							if ( n.nodeType == 1 ) {
 30.1283 +								var id = jQuery.data(n);
 30.1284 +
 30.1285 +								if ( m == "~" && merge[id] ) break;
 30.1286 +								
 30.1287 +								if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
 30.1288 +									if ( m == "~" ) merge[id] = true;
 30.1289 +									r.push( n );
 30.1290 +								}
 30.1291 +								
 30.1292 +								if ( m == "+" ) break;
 30.1293 +							}
 30.1294 +					}
 30.1295 +
 30.1296 +					ret = r;
 30.1297 +
 30.1298 +					// And remove the token
 30.1299 +					t = jQuery.trim( t.replace( re, "" ) );
 30.1300 +					foundToken = true;
 30.1301 +				}
 30.1302 +			}
 30.1303 +
 30.1304 +			// See if there's still an expression, and that we haven't already
 30.1305 +			// matched a token
 30.1306 +			if ( t && !foundToken ) {
 30.1307 +				// Handle multiple expressions
 30.1308 +				if ( !t.indexOf(",") ) {
 30.1309 +					// Clean the result set
 30.1310 +					if ( context == ret[0] ) ret.shift();
 30.1311 +
 30.1312 +					// Merge the result sets
 30.1313 +					done = jQuery.merge( done, ret );
 30.1314 +
 30.1315 +					// Reset the context
 30.1316 +					r = ret = [context];
 30.1317 +
 30.1318 +					// Touch up the selector string
 30.1319 +					t = " " + t.substr(1,t.length);
 30.1320 +
 30.1321 +				} else {
 30.1322 +					// Optimize for the case nodeName#idName
 30.1323 +					var re2 = quickID;
 30.1324 +					var m = re2.exec(t);
 30.1325 +					
 30.1326 +					// Re-organize the results, so that they're consistent
 30.1327 +					if ( m ) {
 30.1328 +					   m = [ 0, m[2], m[3], m[1] ];
 30.1329 +
 30.1330 +					} else {
 30.1331 +						// Otherwise, do a traditional filter check for
 30.1332 +						// ID, class, and element selectors
 30.1333 +						re2 = quickClass;
 30.1334 +						m = re2.exec(t);
 30.1335 +					}
 30.1336 +
 30.1337 +					m[2] = m[2].replace(/\\/g, "");
 30.1338 +
 30.1339 +					var elem = ret[ret.length-1];
 30.1340 +
 30.1341 +					// Try to do a global search by ID, where we can
 30.1342 +					if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 30.1343 +						// Optimization for HTML document case
 30.1344 +						var oid = elem.getElementById(m[2]);
 30.1345 +						
 30.1346 +						// Do a quick check for the existence of the actual ID attribute
 30.1347 +						// to avoid selecting by the name attribute in IE
 30.1348 +						// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
 30.1349 +						if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
 30.1350 +							oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
 30.1351 +
 30.1352 +						// Do a quick check for node name (where applicable) so
 30.1353 +						// that div#foo searches will be really fast
 30.1354 +						ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 30.1355 +					} else {
 30.1356 +						// We need to find all descendant elements
 30.1357 +						for ( var i = 0; ret[i]; i++ ) {
 30.1358 +							// Grab the tag name being searched for
 30.1359 +							var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 30.1360 +
 30.1361 +							// Handle IE7 being really dumb about <object>s
 30.1362 +							if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 30.1363 +								tag = "param";
 30.1364 +
 30.1365 +							r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
 30.1366 +						}
 30.1367 +
 30.1368 +						// It's faster to filter by class and be done with it
 30.1369 +						if ( m[1] == "." )
 30.1370 +							r = jQuery.classFilter( r, m[2] );
 30.1371 +
 30.1372 +						// Same with ID filtering
 30.1373 +						if ( m[1] == "#" ) {
 30.1374 +							var tmp = [];
 30.1375 +
 30.1376 +							// Try to find the element with the ID
 30.1377 +							for ( var i = 0; r[i]; i++ )
 30.1378 +								if ( r[i].getAttribute("id") == m[2] ) {
 30.1379 +									tmp = [ r[i] ];
 30.1380 +									break;
 30.1381 +								}
 30.1382 +
 30.1383 +							r = tmp;
 30.1384 +						}
 30.1385 +
 30.1386 +						ret = r;
 30.1387 +					}
 30.1388 +
 30.1389 +					t = t.replace( re2, "" );
 30.1390 +				}
 30.1391 +
 30.1392 +			}
 30.1393 +
 30.1394 +			// If a selector string still exists
 30.1395 +			if ( t ) {
 30.1396 +				// Attempt to filter it
 30.1397 +				var val = jQuery.filter(t,r);
 30.1398 +				ret = r = val.r;
 30.1399 +				t = jQuery.trim(val.t);
 30.1400 +			}
 30.1401 +		}
 30.1402 +
 30.1403 +		// An error occurred with the selector;
 30.1404 +		// just return an empty set instead
 30.1405 +		if ( t )
 30.1406 +			ret = [];
 30.1407 +
 30.1408 +		// Remove the root context
 30.1409 +		if ( ret && context == ret[0] )
 30.1410 +			ret.shift();
 30.1411 +
 30.1412 +		// And combine the results
 30.1413 +		done = jQuery.merge( done, ret );
 30.1414 +
 30.1415 +		return done;
 30.1416 +	},
 30.1417 +
 30.1418 +	classFilter: function(r,m,not){
 30.1419 +		m = " " + m + " ";
 30.1420 +		var tmp = [];
 30.1421 +		for ( var i = 0; r[i]; i++ ) {
 30.1422 +			var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
 30.1423 +			if ( !not && pass || not && !pass )
 30.1424 +				tmp.push( r[i] );
 30.1425 +		}
 30.1426 +		return tmp;
 30.1427 +	},
 30.1428 +
 30.1429 +	filter: function(t,r,not) {
 30.1430 +		var last;
 30.1431 +
 30.1432 +		// Look for common filter expressions
 30.1433 +		while ( t  && t != last ) {
 30.1434 +			last = t;
 30.1435 +
 30.1436 +			var p = jQuery.parse, m;
 30.1437 +
 30.1438 +			for ( var i = 0; p[i]; i++ ) {
 30.1439 +				m = p[i].exec( t );
 30.1440 +
 30.1441 +				if ( m ) {
 30.1442 +					// Remove what we just matched
 30.1443 +					t = t.substring( m[0].length );
 30.1444 +
 30.1445 +					m[2] = m[2].replace(/\\/g, "");
 30.1446 +					break;
 30.1447 +				}
 30.1448 +			}
 30.1449 +
 30.1450 +			if ( !m )
 30.1451 +				break;
 30.1452 +
 30.1453 +			// :not() is a special case that can be optimized by
 30.1454 +			// keeping it out of the expression list
 30.1455 +			if ( m[1] == ":" && m[2] == "not" )
 30.1456 +				r = jQuery.filter(m[3], r, true).r;
 30.1457 +
 30.1458 +			// We can get a big speed boost by filtering by class here
 30.1459 +			else if ( m[1] == "." )
 30.1460 +				r = jQuery.classFilter(r, m[2], not);
 30.1461 +
 30.1462 +			else if ( m[1] == "[" ) {
 30.1463 +				var tmp = [], type = m[3];
 30.1464 +				
 30.1465 +				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 30.1466 +					var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
 30.1467 +					
 30.1468 +					if ( z == null || /href|src|selected/.test(m[2]) )
 30.1469 +						z = jQuery.attr(a,m[2]) || '';
 30.1470 +
 30.1471 +					if ( (type == "" && !!z ||
 30.1472 +						 type == "=" && z == m[5] ||
 30.1473 +						 type == "!=" && z != m[5] ||
 30.1474 +						 type == "^=" && z && !z.indexOf(m[5]) ||
 30.1475 +						 type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
 30.1476 +						 (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
 30.1477 +							tmp.push( a );
 30.1478 +				}
 30.1479 +				
 30.1480 +				r = tmp;
 30.1481 +
 30.1482 +			// We can get a speed boost by handling nth-child here
 30.1483 +			} else if ( m[1] == ":" && m[2] == "nth-child" ) {
 30.1484 +				var merge = {}, tmp = [],
 30.1485 +					test = /(\d*)n\+?(\d*)/.exec(
 30.1486 +						m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
 30.1487 +						!/\D/.test(m[3]) && "n+" + m[3] || m[3]),
 30.1488 +					first = (test[1] || 1) - 0, last = test[2] - 0;
 30.1489 +
 30.1490 +				for ( var i = 0, rl = r.length; i < rl; i++ ) {
 30.1491 +					var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
 30.1492 +
 30.1493 +					if ( !merge[id] ) {
 30.1494 +						var c = 1;
 30.1495 +
 30.1496 +						for ( var n = parentNode.firstChild; n; n = n.nextSibling )
 30.1497 +							if ( n.nodeType == 1 )
 30.1498 +								n.nodeIndex = c++;
 30.1499 +
 30.1500 +						merge[id] = true;
 30.1501 +					}
 30.1502 +
 30.1503 +					var add = false;
 30.1504 +
 30.1505 +					if ( first == 1 ) {
 30.1506 +						if ( last == 0 || node.nodeIndex == last )
 30.1507 +							add = true;
 30.1508 +					} else if ( (node.nodeIndex + last) % first == 0 )
 30.1509 +						add = true;
 30.1510 +
 30.1511 +					if ( add ^ not )
 30.1512 +						tmp.push( node );
 30.1513 +				}
 30.1514 +
 30.1515 +				r = tmp;
 30.1516 +
 30.1517 +			// Otherwise, find the expression to execute
 30.1518 +			} else {
 30.1519 +				var f = jQuery.expr[m[1]];
 30.1520 +				if ( typeof f != "string" )
 30.1521 +					f = jQuery.expr[m[1]][m[2]];
 30.1522 +
 30.1523 +				// Build a custom macro to enclose it
 30.1524 +				f = eval("false||function(a,i){return " + f + "}");
 30.1525 +
 30.1526 +				// Execute it against the current filter
 30.1527 +				r = jQuery.grep( r, f, not );
 30.1528 +			}
 30.1529 +		}
 30.1530 +
 30.1531 +		// Return an array of filtered elements (r)
 30.1532 +		// and the modified expression string (t)
 30.1533 +		return { r: r, t: t };
 30.1534 +	},
 30.1535 +
 30.1536 +	dir: function( elem, dir ){
 30.1537 +		var matched = [];
 30.1538 +		var cur = elem[dir];
 30.1539 +		while ( cur && cur != document ) {
 30.1540 +			if ( cur.nodeType == 1 )
 30.1541 +				matched.push( cur );
 30.1542 +			cur = cur[dir];
 30.1543 +		}
 30.1544 +		return matched;
 30.1545 +	},
 30.1546 +	
 30.1547 +	nth: function(cur,result,dir,elem){
 30.1548 +		result = result || 1;
 30.1549 +		var num = 0;
 30.1550 +
 30.1551 +		for ( ; cur; cur = cur[dir] )
 30.1552 +			if ( cur.nodeType == 1 && ++num == result )
 30.1553 +				break;
 30.1554 +
 30.1555 +		return cur;
 30.1556 +	},
 30.1557 +	
 30.1558 +	sibling: function( n, elem ) {
 30.1559 +		var r = [];
 30.1560 +
 30.1561 +		for ( ; n; n = n.nextSibling ) {
 30.1562 +			if ( n.nodeType == 1 && (!elem || n != elem) )
 30.1563 +				r.push( n );
 30.1564 +		}
 30.1565 +
 30.1566 +		return r;
 30.1567 +	}
 30.1568 +});
 30.1569 +/*
 30.1570 + * A number of helper functions used for managing events.
 30.1571 + * Many of the ideas behind this code orignated from 
 30.1572 + * Dean Edwards' addEvent library.
 30.1573 + */
 30.1574 +jQuery.event = {
 30.1575 +
 30.1576 +	// Bind an event to an element
 30.1577 +	// Original by Dean Edwards
 30.1578 +	add: function(element, type, handler, data) {
 30.1579 +		// For whatever reason, IE has trouble passing the window object
 30.1580 +		// around, causing it to be cloned in the process
 30.1581 +		if ( jQuery.browser.msie && element.setInterval != undefined )
 30.1582 +			element = window;
 30.1583 +
 30.1584 +		// Make sure that the function being executed has a unique ID
 30.1585 +		if ( !handler.guid )
 30.1586 +			handler.guid = this.guid++;
 30.1587 +			
 30.1588 +		// if data is passed, bind to handler 
 30.1589 +		if( data != undefined ) { 
 30.1590 +        		// Create temporary function pointer to original handler 
 30.1591 +			var fn = handler; 
 30.1592 +
 30.1593 +			// Create unique handler function, wrapped around original handler 
 30.1594 +			handler = function() { 
 30.1595 +				// Pass arguments and context to original handler 
 30.1596 +				return fn.apply(this, arguments); 
 30.1597 +			};
 30.1598 +
 30.1599 +			// Store data in unique handler 
 30.1600 +			handler.data = data;
 30.1601 +
 30.1602 +			// Set the guid of unique handler to the same of original handler, so it can be removed 
 30.1603 +			handler.guid = fn.guid;
 30.1604 +		}
 30.1605 +
 30.1606 +		// Namespaced event handlers
 30.1607 +		var parts = type.split(".");
 30.1608 +		type = parts[0];
 30.1609 +		handler.type = parts[1];
 30.1610 +
 30.1611 +		// Init the element's event structure
 30.1612 +		var events = jQuery.data(element, "events") || jQuery.data(element, "events", {});
 30.1613 +		
 30.1614 +		var handle = jQuery.data(element, "handle", function(){
 30.1615 +			// returned undefined or false
 30.1616 +			var val;
 30.1617 +
 30.1618 +			// Handle the second event of a trigger and when
 30.1619 +			// an event is called after a page has unloaded
 30.1620 +			if ( typeof jQuery == "undefined" || jQuery.event.triggered )
 30.1621 +				return val;
 30.1622 +			
 30.1623 +			val = jQuery.event.handle.apply(element, arguments);
 30.1624 +			
 30.1625 +			return val;
 30.1626 +		});
 30.1627 +
 30.1628 +		// Get the current list of functions bound to this event
 30.1629 +		var handlers = events[type];
 30.1630 +
 30.1631 +		// Init the event handler queue
 30.1632 +		if (!handlers) {
 30.1633 +			handlers = events[type] = {};	
 30.1634 +			
 30.1635 +			// And bind the global event handler to the element
 30.1636 +			if (element.addEventListener)
 30.1637 +				element.addEventListener(type, handle, false);
 30.1638 +			else
 30.1639 +				element.attachEvent("on" + type, handle);
 30.1640 +		}
 30.1641 +
 30.1642 +		// Add the function to the element's handler list
 30.1643 +		handlers[handler.guid] = handler;
 30.1644 +
 30.1645 +		// Keep track of which events have been used, for global triggering
 30.1646 +		this.global[type] = true;
 30.1647 +	},
 30.1648 +
 30.1649 +	guid: 1,
 30.1650 +	global: {},
 30.1651 +
 30.1652 +	// Detach an event or set of events from an element
 30.1653 +	remove: function(element, type, handler) {
 30.1654 +		var events = jQuery.data(element, "events"), ret, index;
 30.1655 +
 30.1656 +		// Namespaced event handlers
 30.1657 +		if ( typeof type == "string" ) {
 30.1658 +			var parts = type.split(".");
 30.1659 +			type = parts[0];
 30.1660 +		}
 30.1661 +
 30.1662 +		if ( events ) {
 30.1663 +			// type is actually an event object here
 30.1664 +			if ( type && type.type ) {
 30.1665 +				handler = type.handler;
 30.1666 +				type = type.type;
 30.1667 +			}
 30.1668 +			
 30.1669 +			if ( !type ) {
 30.1670 +				for ( type in events )
 30.1671 +					this.remove( element, type );
 30.1672 +
 30.1673 +			} else if ( events[type] ) {
 30.1674 +				// remove the given handler for the given type
 30.1675 +				if ( handler )
 30.1676 +					delete events[type][handler.guid];
 30.1677 +				
 30.1678 +				// remove all handlers for the given type
 30.1679 +				else
 30.1680 +					for ( handler in events[type] )
 30.1681 +						// Handle the removal of namespaced events
 30.1682 +						if ( !parts[1] || events[type][handler].type == parts[1] )
 30.1683 +							delete events[type][handler];
 30.1684 +
 30.1685 +				// remove generic event handler if no more handlers exist
 30.1686 +				for ( ret in events[type] ) break;
 30.1687 +				if ( !ret ) {
 30.1688 +					if (element.removeEventListener)
 30.1689 +						element.removeEventListener(type, jQuery.data(element, "handle"), false);
 30.1690 +					else
 30.1691 +						element.detachEvent("on" + type, jQuery.data(element, "handle"));
 30.1692 +					ret = null;
 30.1693 +					delete events[type];
 30.1694 +				}
 30.1695 +			}
 30.1696 +
 30.1697 +			// Remove the expando if it's no longer used
 30.1698 +			for ( ret in events ) break;
 30.1699 +			if ( !ret ) {
 30.1700 +				jQuery.removeData( element, "events" );
 30.1701 +				jQuery.removeData( element, "handle" );
 30.1702 +			}
 30.1703 +		}
 30.1704 +	},
 30.1705 +
 30.1706 +	trigger: function(type, data, element, donative, extra) {
 30.1707 +		// Clone the incoming data, if any
 30.1708 +		data = jQuery.makeArray(data || []);
 30.1709 +
 30.1710 +		// Handle a global trigger
 30.1711 +		if ( !element ) {
 30.1712 +			// Only trigger if we've ever bound an event for it
 30.1713 +			if ( this.global[type] )
 30.1714 +				jQuery("*").add([window, document]).trigger(type, data);
 30.1715 +
 30.1716 +		// Handle triggering a single element
 30.1717 +		} else {
 30.1718 +			var val, ret, fn = jQuery.isFunction( element[ type ] || null ),
 30.1719 +				// Check to see if we need to provide a fake event, or not
 30.1720 +				evt = !data[0] || !data[0].preventDefault;
 30.1721 +			
 30.1722 +			// Pass along a fake event
 30.1723 +			if ( evt )
 30.1724 +				data.unshift( this.fix({ type: type, target: element }) );
 30.1725 +
 30.1726 +			// Enforce the right trigger type
 30.1727 +			data[0].type = type;
 30.1728 +
 30.1729 +			// Trigger the event
 30.1730 +			if ( jQuery.isFunction( jQuery.data(element, "handle") ) )
 30.1731 +				val = jQuery.data(element, "handle").apply( element, data );
 30.1732 +
 30.1733 +			// Handle triggering native .onfoo handlers
 30.1734 +			if ( !fn && element["on"+type] && element["on"+type].apply( element, data ) === false )
 30.1735 +				val = false;
 30.1736 +
 30.1737 +			// Extra functions don't get the custom event object
 30.1738 +			if ( evt )
 30.1739 +				data.shift();
 30.1740 +
 30.1741 +			// Handle triggering of extra function
 30.1742 +			if ( extra && extra.apply( element, data ) === false )
 30.1743 +				val = false;
 30.1744 +
 30.1745 +			// Trigger the native events (except for clicks on links)
 30.1746 +			if ( fn && donative !== false && val !== false && !(jQuery.nodeName(element, 'a') && type == "click") ) {
 30.1747 +				this.triggered = true;
 30.1748 +				element[ type ]();
 30.1749 +			}
 30.1750 +
 30.1751 +			this.triggered = false;
 30.1752 +		}
 30.1753 +
 30.1754 +		return val;
 30.1755 +	},
 30.1756 +
 30.1757 +	handle: function(event) {
 30.1758 +		// returned undefined or false
 30.1759 +		var val;
 30.1760 +
 30.1761 +		// Empty object is for triggered events with no data
 30.1762 +		event = jQuery.event.fix( event || window.event || {} ); 
 30.1763 +
 30.1764 +		// Namespaced event handlers
 30.1765 +		var parts = event.type.split(".");
 30.1766 +		event.type = parts[0];
 30.1767 +
 30.1768 +		var c = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );
 30.1769 +		args.unshift( event );
 30.1770 +
 30.1771 +		for ( var j in c ) {
 30.1772 +			// Pass in a reference to the handler function itself
 30.1773 +			// So that we can later remove it
 30.1774 +			args[0].handler = c[j];
 30.1775 +			args[0].data = c[j].data;
 30.1776 +
 30.1777 +			// Filter the functions by class
 30.1778 +			if ( !parts[1] || c[j].type == parts[1] ) {
 30.1779 +				var tmp = c[j].apply( this, args );
 30.1780 +
 30.1781 +				if ( val !== false )
 30.1782 +					val = tmp;
 30.1783 +
 30.1784 +				if ( tmp === false ) {
 30.1785 +					event.preventDefault();
 30.1786 +					event.stopPropagation();
 30.1787 +				}
 30.1788 +			}
 30.1789 +		}
 30.1790 +
 30.1791 +		// Clean up added properties in IE to prevent memory leak
 30.1792 +		if (jQuery.browser.msie)
 30.1793 +			event.target = event.preventDefault = event.stopPropagation =
 30.1794 +				event.handler = event.data = null;
 30.1795 +
 30.1796 +		return val;
 30.1797 +	},
 30.1798 +
 30.1799 +	fix: function(event) {
 30.1800 +		// store a copy of the original event object 
 30.1801 +		// and clone to set read-only properties
 30.1802 +		var originalEvent = event;
 30.1803 +		event = jQuery.extend({}, originalEvent);
 30.1804 +		
 30.1805 +		// add preventDefault and stopPropagation since 
 30.1806 +		// they will not work on the clone
 30.1807 +		event.preventDefault = function() {
 30.1808 +			// if preventDefault exists run it on the original event
 30.1809 +			if (originalEvent.preventDefault)
 30.1810 +				originalEvent.preventDefault();
 30.1811 +			// otherwise set the returnValue property of the original event to false (IE)
 30.1812 +			originalEvent.returnValue = false;
 30.1813 +		};
 30.1814 +		event.stopPropagation = function() {
 30.1815 +			// if stopPropagation exists run it on the original event
 30.1816 +			if (originalEvent.stopPropagation)
 30.1817 +				originalEvent.stopPropagation();
 30.1818 +			// otherwise set the cancelBubble property of the original event to true (IE)
 30.1819 +			originalEvent.cancelBubble = true;
 30.1820 +		};
 30.1821 +		
 30.1822 +		// Fix target property, if necessary
 30.1823 +		if ( !event.target && event.srcElement )
 30.1824 +			event.target = event.srcElement;
 30.1825 +				
 30.1826 +		// check if target is a textnode (safari)
 30.1827 +		if (jQuery.browser.safari && event.target.nodeType == 3)
 30.1828 +			event.target = originalEvent.target.parentNode;
 30.1829 +
 30.1830 +		// Add relatedTarget, if necessary
 30.1831 +		if ( !event.relatedTarget && event.fromElement )
 30.1832 +			event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
 30.1833 +
 30.1834 +		// Calculate pageX/Y if missing and clientX/Y available
 30.1835 +		if ( event.pageX == null && event.clientX != null ) {
 30.1836 +			var e = document.documentElement, b = document.body;
 30.1837 +			event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft || 0);
 30.1838 +			event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop || 0);
 30.1839 +		}
 30.1840 +			
 30.1841 +		// Add which for key events
 30.1842 +		if ( !event.which && (event.charCode || event.keyCode) )
 30.1843 +			event.which = event.charCode || event.keyCode;
 30.1844 +		
 30.1845 +		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 30.1846 +		if ( !event.metaKey && event.ctrlKey )
 30.1847 +			event.metaKey = event.ctrlKey;
 30.1848 +
 30.1849 +		// Add which for click: 1 == left; 2 == middle; 3 == right
 30.1850 +		// Note: button is not normalized, so don't use it
 30.1851 +		if ( !event.which && event.button )
 30.1852 +			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 30.1853 +			
 30.1854 +		return event;
 30.1855 +	}
 30.1856 +};
 30.1857 +
 30.1858 +jQuery.fn.extend({
 30.1859 +	bind: function( type, data, fn ) {
 30.1860 +		return type == "unload" ? this.one(type, data, fn) : this.each(function(){
 30.1861 +			jQuery.event.add( this, type, fn || data, fn && data );
 30.1862 +		});
 30.1863 +	},
 30.1864 +	
 30.1865 +	one: function( type, data, fn ) {
 30.1866 +		return this.each(function(){
 30.1867 +			jQuery.event.add( this, type, function(event) {
 30.1868 +				jQuery(this).unbind(event);
 30.1869 +				return (fn || data).apply( this, arguments);
 30.1870 +			}, fn && data);
 30.1871 +		});
 30.1872 +	},
 30.1873 +
 30.1874 +	unbind: function( type, fn ) {
 30.1875 +		return this.each(function(){
 30.1876 +			jQuery.event.remove( this, type, fn );
 30.1877 +		});
 30.1878 +	},
 30.1879 +
 30.1880 +	trigger: function( type, data, fn ) {
 30.1881 +		return this.each(function(){
 30.1882 +			jQuery.event.trigger( type, data, this, true, fn );
 30.1883 +		});
 30.1884 +	},
 30.1885 +
 30.1886 +	triggerHandler: function( type, data, fn ) {
 30.1887 +		if ( this[0] )
 30.1888 +			return jQuery.event.trigger( type, data, this[0], false, fn );
 30.1889 +	},
 30.1890 +
 30.1891 +	toggle: function() {
 30.1892 +		// Save reference to arguments for access in closure
 30.1893 +		var a = arguments;
 30.1894 +
 30.1895 +		return this.click(function(e) {
 30.1896 +			// Figure out which function to execute
 30.1897 +			this.lastToggle = 0 == this.lastToggle ? 1 : 0;
 30.1898 +			
 30.1899 +			// Make sure that clicks stop
 30.1900 +			e.preventDefault();
 30.1901 +			
 30.1902 +			// and execute the function
 30.1903 +			return a[this.lastToggle].apply( this, [e] ) || false;
 30.1904 +		});
 30.1905 +	},
 30.1906 +
 30.1907 +	hover: function(f,g) {
 30.1908 +		
 30.1909 +		// A private function for handling mouse 'hovering'
 30.1910 +		function handleHover(e) {
 30.1911 +			// Check if mouse(over|out) are still within the same parent element
 30.1912 +			var p = e.relatedTarget;
 30.1913 +	
 30.1914 +			// Traverse up the tree
 30.1915 +			while ( p && p != this ) try { p = p.parentNode; } catch(e) { p = this; };
 30.1916 +			
 30.1917 +			// If we actually just moused on to a sub-element, ignore it
 30.1918 +			if ( p == this ) return false;
 30.1919 +			
 30.1920 +			// Execute the right function
 30.1921 +			return (e.type == "mouseover" ? f : g).apply(this, [e]);
 30.1922 +		}
 30.1923 +		
 30.1924 +		// Bind the function to the two event listeners
 30.1925 +		return this.mouseover(handleHover).mouseout(handleHover);
 30.1926 +	},
 30.1927 +	
 30.1928 +	ready: function(f) {
 30.1929 +		// Attach the listeners
 30.1930 +		bindReady();
 30.1931 +
 30.1932 +		// If the DOM is already ready
 30.1933 +		if ( jQuery.isReady )
 30.1934 +			// Execute the function immediately
 30.1935 +			f.apply( document, [jQuery] );
 30.1936 +			
 30.1937 +		// Otherwise, remember the function for later
 30.1938 +		else
 30.1939 +			// Add the function to the wait list
 30.1940 +			jQuery.readyList.push( function() { return f.apply(this, [jQuery]); } );
 30.1941 +	
 30.1942 +		return this;
 30.1943 +	}
 30.1944 +});
 30.1945 +
 30.1946 +jQuery.extend({
 30.1947 +	/*
 30.1948 +	 * All the code that makes DOM Ready work nicely.
 30.1949 +	 */
 30.1950 +	isReady: false,
 30.1951 +	readyList: [],
 30.1952 +	
 30.1953 +	// Handle when the DOM is ready
 30.1954 +	ready: function() {
 30.1955 +		// Make sure that the DOM is not already loaded
 30.1956 +		if ( !jQuery.isReady ) {
 30.1957 +			// Remember that the DOM is ready
 30.1958 +			jQuery.isReady = true;
 30.1959 +			
 30.1960 +			// If there are functions bound, to execute
 30.1961 +			if ( jQuery.readyList ) {
 30.1962 +				// Execute all of them
 30.1963 +				jQuery.each( jQuery.readyList, function(){
 30.1964 +					this.apply( document );
 30.1965 +				});
 30.1966 +				
 30.1967 +				// Reset the list of functions
 30.1968 +				jQuery.readyList = null;
 30.1969 +			}
 30.1970 +			// Remove event listener to avoid memory leak
 30.1971 +			if ( jQuery.browser.mozilla || jQuery.browser.opera )
 30.1972 +				document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
 30.1973 +			
 30.1974 +			// Remove script element used by IE hack
 30.1975 +			if( !window.frames.length ) // don't remove if frames are present (#1187)
 30.1976 +				jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
 30.1977 +		}
 30.1978 +	}
 30.1979 +});
 30.1980 +
 30.1981 +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
 30.1982 +	"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," + 
 30.1983 +	"submit,keydown,keypress,keyup,error").split(","), function(i,o){
 30.1984 +	
 30.1985 +	// Handle event binding
 30.1986 +	jQuery.fn[o] = function(f){
 30.1987 +		return f ? this.bind(o, f) : this.trigger(o);
 30.1988 +	};
 30.1989 +});
 30.1990 +
 30.1991 +var readyBound = false;
 30.1992 +
 30.1993 +function bindReady(){
 30.1994 +	if ( readyBound ) return;
 30.1995 +	readyBound = true;
 30.1996 +
 30.1997 +	// If Mozilla is used
 30.1998 +	if ( jQuery.browser.mozilla || jQuery.browser.opera )
 30.1999 +		// Use the handy event callback
 30.2000 +		document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
 30.2001 +	
 30.2002 +	// If IE is used, use the excellent hack by Matthias Miller
 30.2003 +	// http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
 30.2004 +	else if ( jQuery.browser.msie ) {
 30.2005 +	
 30.2006 +		// Only works if you document.write() it
 30.2007 +		document.write("<scr" + "ipt id=__ie_init defer=true " + 
 30.2008 +			"src=//:><\/script>");
 30.2009 +	
 30.2010 +		// Use the defer script hack
 30.2011 +		var script = document.getElementById("__ie_init");
 30.2012 +		
 30.2013 +		// script does not exist if jQuery is loaded dynamically
 30.2014 +		if ( script ) 
 30.2015 +			script.onreadystatechange = function() {
 30.2016 +				if ( this.readyState != "complete" ) return;
 30.2017 +				jQuery.ready();
 30.2018 +			};
 30.2019 +	
 30.2020 +		// Clear from memory
 30.2021 +		script = null;
 30.2022 +	
 30.2023 +	// If Safari  is used
 30.2024 +	} else if ( jQuery.browser.safari )
 30.2025 +		// Continually check to see if the document.readyState is valid
 30.2026 +		jQuery.safariTimer = setInterval(function(){
 30.2027 +			// loaded and complete are both valid states
 30.2028 +			if ( document.readyState == "loaded" || 
 30.2029 +				document.readyState == "complete" ) {
 30.2030 +	
 30.2031 +				// If either one are found, remove the timer
 30.2032 +				clearInterval( jQuery.safariTimer );
 30.2033 +				jQuery.safariTimer = null;
 30.2034 +	
 30.2035 +				// and execute any waiting functions
 30.2036 +				jQuery.ready();
 30.2037 +			}
 30.2038 +		}, 10); 
 30.2039 +
 30.2040 +	// A fallback to window.onload, that will always work
 30.2041 +	jQuery.event.add( window, "load", jQuery.ready );
 30.2042 +}
 30.2043 +jQuery.fn.extend({
 30.2044 +	load: function( url, params, callback ) {
 30.2045 +		if ( jQuery.isFunction( url ) )
 30.2046 +			return this.bind("load", url);
 30.2047 +
 30.2048 +		var off = url.indexOf(" ");
 30.2049 +		if ( off >= 0 ) {
 30.2050 +			var selector = url.slice(off, url.length);
 30.2051 +			url = url.slice(0, off);
 30.2052 +		}
 30.2053 +
 30.2054 +		callback = callback || function(){};
 30.2055 +
 30.2056 +		// Default to a GET request
 30.2057 +		var type = "GET";
 30.2058 +
 30.2059 +		// If the second parameter was provided
 30.2060 +		if ( params )
 30.2061 +			// If it's a function
 30.2062 +			if ( jQuery.isFunction( params ) ) {
 30.2063 +				// We assume that it's the callback
 30.2064 +				callback = params;
 30.2065 +				params = null;
 30.2066 +
 30.2067 +			// Otherwise, build a param string
 30.2068 +			} else {
 30.2069 +				params = jQuery.param( params );
 30.2070 +				type = "POST";
 30.2071 +			}
 30.2072 +
 30.2073 +		var self = this;
 30.2074 +
 30.2075 +		// Request the remote document
 30.2076 +		jQuery.ajax({
 30.2077 +			url: url,
 30.2078 +			type: type,
 30.2079 +			data: params,
 30.2080 +			complete: function(res, status){
 30.2081 +				// If successful, inject the HTML into all the matched elements
 30.2082 +				if ( status == "success" || status == "notmodified" )
 30.2083 +					// See if a selector was specified
 30.2084 +					self.html( selector ?
 30.2085 +						// Create a dummy div to hold the results
 30.2086 +						jQuery("<div/>")
 30.2087 +							// inject the contents of the document in, removing the scripts
 30.2088 +							// to avoid any 'Permission Denied' errors in IE
 30.2089 +							.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
 30.2090 +
 30.2091 +							// Locate the specified elements
 30.2092 +							.find(selector) :
 30.2093 +
 30.2094 +						// If not, just inject the full result
 30.2095 +						res.responseText );
 30.2096 +
 30.2097 +				// Add delay to account for Safari's delay in globalEval
 30.2098 +				setTimeout(function(){
 30.2099 +					self.each( callback, [res.responseText, status, res] );
 30.2100 +				}, 13);
 30.2101 +			}
 30.2102 +		});
 30.2103 +		return this;
 30.2104 +	},
 30.2105 +
 30.2106 +	serialize: function() {
 30.2107 +		return jQuery.param(this.serializeArray());
 30.2108 +	},
 30.2109 +	serializeArray: function() {
 30.2110 +		return this.map(function(){
 30.2111 +			return jQuery.nodeName(this, "form") ?
 30.2112 +				jQuery.makeArray(this.elements) : this;
 30.2113 +		})
 30.2114 +		.filter(function(){
 30.2115 +			return this.name && !this.disabled && 
 30.2116 +				(this.checked || /select|textarea/i.test(this.nodeName) || 
 30.2117 +					/text|hidden|password/i.test(this.type));
 30.2118 +		})
 30.2119 +		.map(function(i, elem){
 30.2120 +			var val = jQuery(this).val();
 30.2121 +			return val == null ? null :
 30.2122 +				val.constructor == Array ?
 30.2123 +					jQuery.map( val, function(val, i){
 30.2124 +						return {name: elem.name, value: val};
 30.2125 +					}) :
 30.2126 +					{name: elem.name, value: val};
 30.2127 +		}).get();
 30.2128 +	}
 30.2129 +});
 30.2130 +
 30.2131 +// Attach a bunch of functions for handling common AJAX events
 30.2132 +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 30.2133 +	jQuery.fn[o] = function(f){
 30.2134 +		return this.bind(o, f);
 30.2135 +	};
 30.2136 +});
 30.2137 +
 30.2138 +var jsc = (new Date).getTime();
 30.2139 +
 30.2140 +jQuery.extend({
 30.2141 +	get: function( url, data, callback, type ) {
 30.2142 +		// shift arguments if data argument was ommited
 30.2143 +		if ( jQuery.isFunction( data ) ) {
 30.2144 +			callback = data;
 30.2145 +			data = null;
 30.2146 +		}
 30.2147 +		
 30.2148 +		return jQuery.ajax({
 30.2149 +			type: "GET",
 30.2150 +			url: url,
 30.2151 +			data: data,
 30.2152 +			success: callback,
 30.2153 +			dataType: type
 30.2154 +		});
 30.2155 +	},
 30.2156 +
 30.2157 +	getScript: function( url, callback ) {
 30.2158 +		return jQuery.get(url, null, callback, "script");
 30.2159 +	},
 30.2160 +
 30.2161 +	getJSON: function( url, data, callback ) {
 30.2162 +		return jQuery.get(url, data, callback, "json");
 30.2163 +	},
 30.2164 +
 30.2165 +	post: function( url, data, callback, type ) {
 30.2166 +		if ( jQuery.isFunction( data ) ) {
 30.2167 +			callback = data;
 30.2168 +			data = {};
 30.2169 +		}
 30.2170 +
 30.2171 +		return jQuery.ajax({
 30.2172 +			type: "POST",
 30.2173 +			url: url,
 30.2174 +			data: data,
 30.2175 +			success: callback,
 30.2176 +			dataType: type
 30.2177 +		});
 30.2178 +	},
 30.2179 +
 30.2180 +	ajaxSetup: function( settings ) {
 30.2181 +		jQuery.extend( jQuery.ajaxSettings, settings );
 30.2182 +	},
 30.2183 +
 30.2184 +	ajaxSettings: {
 30.2185 +		global: true,
 30.2186 +		type: "GET",
 30.2187 +		timeout: 0,
 30.2188 +		contentType: "application/x-www-form-urlencoded",
 30.2189 +		processData: true,
 30.2190 +		async: true,
 30.2191 +		data: null
 30.2192 +	},
 30.2193 +	
 30.2194 +	// Last-Modified header cache for next request
 30.2195 +	lastModified: {},
 30.2196 +
 30.2197 +	ajax: function( s ) {
 30.2198 +		var jsonp, jsre = /=(\?|%3F)/g, status, data;
 30.2199 +
 30.2200 +		// Extend the settings, but re-extend 's' so that it can be
 30.2201 +		// checked again later (in the test suite, specifically)
 30.2202 +		s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 30.2203 +
 30.2204 +		// convert data if not already a string
 30.2205 +		if ( s.data && s.processData && typeof s.data != "string" )
 30.2206 +			s.data = jQuery.param(s.data);
 30.2207 +
 30.2208 +		// Handle JSONP Parameter Callbacks
 30.2209 +		if ( s.dataType == "jsonp" ) {
 30.2210 +			if ( s.type.toLowerCase() == "get" ) {
 30.2211 +				if ( !s.url.match(jsre) )
 30.2212 +					s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
 30.2213 +			} else if ( !s.data || !s.data.match(jsre) )
 30.2214 +				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
 30.2215 +			s.dataType = "json";
 30.2216 +		}
 30.2217 +
 30.2218 +		// Build temporary JSONP function
 30.2219 +		if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
 30.2220 +			jsonp = "jsonp" + jsc++;
 30.2221 +
 30.2222 +			// Replace the =? sequence both in the query string and the data
 30.2223 +			if ( s.data )
 30.2224 +				s.data = s.data.replace(jsre, "=" + jsonp);
 30.2225 +			s.url = s.url.replace(jsre, "=" + jsonp);
 30.2226 +
 30.2227 +			// We need to make sure
 30.2228 +			// that a JSONP style response is executed properly
 30.2229 +			s.dataType = "script";
 30.2230 +
 30.2231 +			// Handle JSONP-style loading
 30.2232 +			window[ jsonp ] = function(tmp){
 30.2233 +				data = tmp;
 30.2234 +				success();
 30.2235 +				complete();
 30.2236 +				// Garbage collect
 30.2237 +				window[ jsonp ] = undefined;
 30.2238 +				try{ delete window[ jsonp ]; } catch(e){}
 30.2239 +			};
 30.2240 +		}
 30.2241 +
 30.2242 +		if ( s.dataType == "script" && s.cache == null )
 30.2243 +			s.cache = false;
 30.2244 +
 30.2245 +		if ( s.cache === false && s.type.toLowerCase() == "get" )
 30.2246 +			s.url += (s.url.match(/\?/) ? "&" : "?") + "_=" + (new Date()).getTime();
 30.2247 +
 30.2248 +		// If data is available, append data to url for get requests
 30.2249 +		if ( s.data && s.type.toLowerCase() == "get" ) {
 30.2250 +			s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
 30.2251 +
 30.2252 +			// IE likes to send both get and post data, prevent this
 30.2253 +			s.data = null;
 30.2254 +		}
 30.2255 +
 30.2256 +		// Watch for a new set of requests
 30.2257 +		if ( s.global && ! jQuery.active++ )
 30.2258 +			jQuery.event.trigger( "ajaxStart" );
 30.2259 +
 30.2260 +		// If we're requesting a remote document
 30.2261 +		// and trying to load JSON or Script
 30.2262 +		if ( !s.url.indexOf("http") && s.dataType == "script" ) {
 30.2263 +			var head = document.getElementsByTagName("head")[0];
 30.2264 +			var script = document.createElement("script");
 30.2265 +			script.src = s.url;
 30.2266 +
 30.2267 +			// Handle Script loading
 30.2268 +			if ( !jsonp && (s.success || s.complete) ) {
 30.2269 +				var done = false;
 30.2270 +
 30.2271 +				// Attach handlers for all browsers
 30.2272 +				script.onload = script.onreadystatechange = function(){
 30.2273 +					if ( !done && (!this.readyState || 
 30.2274 +							this.readyState == "loaded" || this.readyState == "complete") ) {
 30.2275 +						done = true;
 30.2276 +						success();
 30.2277 +						complete();
 30.2278 +						head.removeChild( script );
 30.2279 +					}
 30.2280 +				};
 30.2281 +			}
 30.2282 +
 30.2283 +			head.appendChild(script);
 30.2284 +
 30.2285 +			// We handle everything using the script element injection
 30.2286 +			return;
 30.2287 +		}
 30.2288 +
 30.2289 +		var requestDone = false;
 30.2290 +
 30.2291 +		// Create the request object; Microsoft failed to properly
 30.2292 +		// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
 30.2293 +		var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 30.2294 +
 30.2295 +		// Open the socket
 30.2296 +		xml.open(s.type, s.url, s.async);
 30.2297 +
 30.2298 +		// Set the correct header, if data is being sent
 30.2299 +		if ( s.data )
 30.2300 +			xml.setRequestHeader("Content-Type", s.contentType);
 30.2301 +
 30.2302 +		// Set the If-Modified-Since header, if ifModified mode.
 30.2303 +		if ( s.ifModified )
 30.2304 +			xml.setRequestHeader("If-Modified-Since",
 30.2305 +				jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 30.2306 +
 30.2307 +		// Set header so the called script knows that it's an XMLHttpRequest
 30.2308 +		xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 30.2309 +
 30.2310 +		// Allow custom headers/mimetypes
 30.2311 +		if ( s.beforeSend )
 30.2312 +			s.beforeSend(xml);
 30.2313 +			
 30.2314 +		if ( s.global )
 30.2315 +		    jQuery.event.trigger("ajaxSend", [xml, s]);
 30.2316 +
 30.2317 +		// Wait for a response to come back
 30.2318 +		var onreadystatechange = function(isTimeout){
 30.2319 +			// The transfer is complete and the data is available, or the request timed out
 30.2320 +			if ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
 30.2321 +				requestDone = true;
 30.2322 +				
 30.2323 +				// clear poll interval
 30.2324 +				if (ival) {
 30.2325 +					clearInterval(ival);
 30.2326 +					ival = null;
 30.2327 +				}
 30.2328 +				
 30.2329 +				status = isTimeout == "timeout" && "timeout" ||
 30.2330 +					!jQuery.httpSuccess( xml ) && "error" ||
 30.2331 +					s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||
 30.2332 +					"success";
 30.2333 +
 30.2334 +				if ( status == "success" ) {
 30.2335 +					// Watch for, and catch, XML document parse errors
 30.2336 +					try {
 30.2337 +						// process the data (runs the xml through httpData regardless of callback)
 30.2338 +						data = jQuery.httpData( xml, s.dataType );
 30.2339 +					} catch(e) {
 30.2340 +						status = "parsererror";
 30.2341 +					}
 30.2342 +				}
 30.2343 +
 30.2344 +				// Make sure that the request was successful or notmodified
 30.2345 +				if ( status == "success" ) {
 30.2346 +					// Cache Last-Modified header, if ifModified mode.
 30.2347 +					var modRes;
 30.2348 +					try {
 30.2349 +						modRes = xml.getResponseHeader("Last-Modified");
 30.2350 +					} catch(e) {} // swallow exception thrown by FF if header is not available
 30.2351 +	
 30.2352 +					if ( s.ifModified && modRes )
 30.2353 +						jQuery.lastModified[s.url] = modRes;
 30.2354 +
 30.2355 +					// JSONP handles its own success callback
 30.2356 +					if ( !jsonp )
 30.2357 +						success();	
 30.2358 +				} else
 30.2359 +					jQuery.handleError(s, xml, status);
 30.2360 +
 30.2361 +				// Fire the complete handlers
 30.2362 +				complete();
 30.2363 +
 30.2364 +				// Stop memory leaks
 30.2365 +				if ( s.async )
 30.2366 +					xml = null;
 30.2367 +			}
 30.2368 +		};
 30.2369 +		
 30.2370 +		if ( s.async ) {
 30.2371 +			// don't attach the handler to the request, just poll it instead
 30.2372 +			var ival = setInterval(onreadystatechange, 13); 
 30.2373 +
 30.2374 +			// Timeout checker
 30.2375 +			if ( s.timeout > 0 )
 30.2376 +				setTimeout(function(){
 30.2377 +					// Check to see if the request is still happening
 30.2378 +					if ( xml ) {
 30.2379 +						// Cancel the request
 30.2380 +						xml.abort();
 30.2381 +	
 30.2382 +						if( !requestDone )
 30.2383 +							onreadystatechange( "timeout" );
 30.2384 +					}
 30.2385 +				}, s.timeout);
 30.2386 +		}
 30.2387 +			
 30.2388 +		// Send the data
 30.2389 +		try {
 30.2390 +			xml.send(s.data);
 30.2391 +		} catch(e) {
 30.2392 +			jQuery.handleError(s, xml, null, e);
 30.2393 +		}
 30.2394 +		
 30.2395 +		// firefox 1.5 doesn't fire statechange for sync requests
 30.2396 +		if ( !s.async )
 30.2397 +			onreadystatechange();
 30.2398 +		
 30.2399 +		// return XMLHttpRequest to allow aborting the request etc.
 30.2400 +		return xml;
 30.2401 +
 30.2402 +		function success(){
 30.2403 +			// If a local callback was specified, fire it and pass it the data
 30.2404 +			if ( s.success )
 30.2405 +				s.success( data, status );
 30.2406 +
 30.2407 +			// Fire the global callback
 30.2408 +			if ( s.global )
 30.2409 +				jQuery.event.trigger( "ajaxSuccess", [xml, s] );
 30.2410 +		}
 30.2411 +
 30.2412 +		function complete(){
 30.2413 +			// Process result
 30.2414 +			if ( s.complete )
 30.2415 +				s.complete(xml, status);
 30.2416 +
 30.2417 +			// The request was completed
 30.2418 +			if ( s.global )
 30.2419 +				jQuery.event.trigger( "ajaxComplete", [xml, s] );
 30.2420 +
 30.2421 +			// Handle the global AJAX counter
 30.2422 +			if ( s.global && ! --jQuery.active )
 30.2423 +				jQuery.event.trigger( "ajaxStop" );
 30.2424 +		}
 30.2425 +	},
 30.2426 +
 30.2427 +	handleError: function( s, xml, status, e ) {
 30.2428 +		// If a local callback was specified, fire it
 30.2429 +		if ( s.error ) s.error( xml, status, e );
 30.2430 +
 30.2431 +		// Fire the global callback
 30.2432 +		if ( s.global )
 30.2433 +			jQuery.event.trigger( "ajaxError", [xml, s, e] );
 30.2434 +	},
 30.2435 +
 30.2436 +	// Counter for holding the number of active queries
 30.2437 +	active: 0,
 30.2438 +
 30.2439 +	// Determines if an XMLHttpRequest was successful or not
 30.2440 +	httpSuccess: function( r ) {
 30.2441 +		try {
 30.2442 +			return !r.status && location.protocol == "file:" ||
 30.2443 +				( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
 30.2444 +				jQuery.browser.safari && r.status == undefined;
 30.2445 +		} catch(e){}
 30.2446 +		return false;
 30.2447 +	},
 30.2448 +
 30.2449 +	// Determines if an XMLHttpRequest returns NotModified
 30.2450 +	httpNotModified: function( xml, url ) {
 30.2451 +		try {
 30.2452 +			var xmlRes = xml.getResponseHeader("Last-Modified");
 30.2453 +
 30.2454 +			// Firefox always returns 200. check Last-Modified date
 30.2455 +			return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
 30.2456 +				jQuery.browser.safari && xml.status == undefined;
 30.2457 +		} catch(e){}
 30.2458 +		return false;
 30.2459 +	},
 30.2460 +
 30.2461 +	httpData: function( r, type ) {
 30.2462 +		var ct = r.getResponseHeader("content-type");
 30.2463 +		var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;
 30.2464 +		var data = xml ? r.responseXML : r.responseText;
 30.2465 +
 30.2466 +		if ( xml && data.documentElement.tagName == "parsererror" )
 30.2467 +			throw "parsererror";
 30.2468 +
 30.2469 +		// If the type is "script", eval it in global context
 30.2470 +		if ( type == "script" )
 30.2471 +			jQuery.globalEval( data );
 30.2472 +
 30.2473 +		// Get the JavaScript object, if JSON is used.
 30.2474 +		if ( type == "json" )
 30.2475 +			data = eval("(" + data + ")");
 30.2476 +
 30.2477 +		return data;
 30.2478 +	},
 30.2479 +
 30.2480 +	// Serialize an array of form elements or a set of
 30.2481 +	// key/values into a query string
 30.2482 +	param: function( a ) {
 30.2483 +		var s = [];
 30.2484 +
 30.2485 +		// If an array was passed in, assume that it is an array
 30.2486 +		// of form elements
 30.2487 +		if ( a.constructor == Array || a.jquery )
 30.2488 +			// Serialize the form elements
 30.2489 +			jQuery.each( a, function(){
 30.2490 +				s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
 30.2491 +			});
 30.2492 +
 30.2493 +		// Otherwise, assume that it's an object of key/value pairs
 30.2494 +		else
 30.2495 +			// Serialize the key/values
 30.2496 +			for ( var j in a )
 30.2497 +				// If the value is an array then the key names need to be repeated
 30.2498 +				if ( a[j] && a[j].constructor == Array )
 30.2499 +					jQuery.each( a[j], function(){
 30.2500 +						s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 30.2501 +					});
 30.2502 +				else
 30.2503 +					s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
 30.2504 +
 30.2505 +		// Return the resulting serialization
 30.2506 +		return s.join("&").replace(/%20/g, "+");
 30.2507 +	}
 30.2508 +
 30.2509 +});
 30.2510 +jQuery.fn.extend({
 30.2511 +	show: function(speed,callback){
 30.2512 +		return speed ?
 30.2513 +			this.animate({
 30.2514 +				height: "show", width: "show", opacity: "show"
 30.2515 +			}, speed, callback) :
 30.2516 +			
 30.2517 +			this.filter(":hidden").each(function(){
 30.2518 +				this.style.display = this.oldblock ? this.oldblock : "";
 30.2519 +				if ( jQuery.css(this,"display") == "none" )
 30.2520 +					this.style.display = "block";
 30.2521 +			}).end();
 30.2522 +	},
 30.2523 +	
 30.2524 +	hide: function(speed,callback){
 30.2525 +		return speed ?
 30.2526 +			this.animate({
 30.2527 +				height: "hide", width: "hide", opacity: "hide"
 30.2528 +			}, speed, callback) :
 30.2529 +			
 30.2530 +			this.filter(":visible").each(function(){
 30.2531 +				this.oldblock = this.oldblock || jQuery.css(this,"display");
 30.2532 +				if ( this.oldblock == "none" )
 30.2533 +					this.oldblock = "block";
 30.2534 +				this.style.display = "none";
 30.2535 +			}).end();
 30.2536 +	},
 30.2537 +
 30.2538 +	// Save the old toggle function
 30.2539 +	_toggle: jQuery.fn.toggle,
 30.2540 +	
 30.2541 +	toggle: function( fn, fn2 ){
 30.2542 +		return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
 30.2543 +			this._toggle( fn, fn2 ) :
 30.2544 +			fn ?
 30.2545 +				this.animate({
 30.2546 +					height: "toggle", width: "toggle", opacity: "toggle"
 30.2547 +				}, fn, fn2) :
 30.2548 +				this.each(function(){
 30.2549 +					jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
 30.2550 +				});
 30.2551 +	},
 30.2552 +	
 30.2553 +	slideDown: function(speed,callback){
 30.2554 +		return this.animate({height: "show"}, speed, callback);
 30.2555 +	},
 30.2556 +	
 30.2557 +	slideUp: function(speed,callback){
 30.2558 +		return this.animate({height: "hide"}, speed, callback);
 30.2559 +	},
 30.2560 +
 30.2561 +	slideToggle: function(speed, callback){
 30.2562 +		return this.animate({height: "toggle"}, speed, callback);
 30.2563 +	},
 30.2564 +	
 30.2565 +	fadeIn: function(speed, callback){
 30.2566 +		return this.animate({opacity: "show"}, speed, callback);
 30.2567 +	},
 30.2568 +	
 30.2569 +	fadeOut: function(speed, callback){
 30.2570 +		return this.animate({opacity: "hide"}, speed, callback);
 30.2571 +	},
 30.2572 +	
 30.2573 +	fadeTo: function(speed,to,callback){
 30.2574 +		return this.animate({opacity: to}, speed, callback);
 30.2575 +	},
 30.2576 +	
 30.2577 +	animate: function( prop, speed, easing, callback ) {
 30.2578 +		var opt = jQuery.speed(speed, easing, callback);
 30.2579 +
 30.2580 +		return this[ opt.queue === false ? "each" : "queue" ](function(){
 30.2581 +			opt = jQuery.extend({}, opt);
 30.2582 +			var hidden = jQuery(this).is(":hidden"), self = this;
 30.2583 +			
 30.2584 +			for ( var p in prop ) {
 30.2585 +				if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
 30.2586 +					return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
 30.2587 +
 30.2588 +				if ( p == "height" || p == "width" ) {
 30.2589 +					// Store display property
 30.2590 +					opt.display = jQuery.css(this, "display");
 30.2591 +
 30.2592 +					// Make sure that nothing sneaks out
 30.2593 +					opt.overflow = this.style.overflow;
 30.2594 +				}
 30.2595 +			}
 30.2596 +
 30.2597 +			if ( opt.overflow != null )
 30.2598 +				this.style.overflow = "hidden";
 30.2599 +
 30.2600 +			opt.curAnim = jQuery.extend({}, prop);
 30.2601 +			
 30.2602 +			jQuery.each( prop, function(name, val){
 30.2603 +				var e = new jQuery.fx( self, opt, name );
 30.2604 +
 30.2605 +				if ( /toggle|show|hide/.test(val) )
 30.2606 +					e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 30.2607 +				else {
 30.2608 +					var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
 30.2609 +						start = e.cur(true) || 0;
 30.2610 +
 30.2611 +					if ( parts ) {
 30.2612 +						var end = parseFloat(parts[2]),
 30.2613 +							unit = parts[3] || "px";
 30.2614 +
 30.2615 +						// We need to compute starting value
 30.2616 +						if ( unit != "px" ) {
 30.2617 +							self.style[ name ] = (end || 1) + unit;
 30.2618 +							start = ((end || 1) / e.cur(true)) * start;
 30.2619 +							self.style[ name ] = start + unit;
 30.2620 +						}
 30.2621 +
 30.2622 +						// If a +=/-= token was provided, we're doing a relative animation
 30.2623 +						if ( parts[1] )
 30.2624 +							end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
 30.2625 +
 30.2626 +						e.custom( start, end, unit );
 30.2627 +					} else
 30.2628 +						e.custom( start, val, "" );
 30.2629 +				}
 30.2630 +			});
 30.2631 +
 30.2632 +			// For JS strict compliance
 30.2633 +			return true;
 30.2634 +		});
 30.2635 +	},
 30.2636 +	
 30.2637 +	queue: function(type, fn){
 30.2638 +		if ( jQuery.isFunction(type) ) {
 30.2639 +			fn = type;
 30.2640 +			type = "fx";
 30.2641 +		}
 30.2642 +
 30.2643 +		if ( !type || (typeof type == "string" && !fn) )
 30.2644 +			return queue( this[0], type );
 30.2645 +
 30.2646 +		return this.each(function(){
 30.2647 +			if ( fn.constructor == Array )
 30.2648 +				queue(this, type, fn);
 30.2649 +			else {
 30.2650 +				queue(this, type).push( fn );
 30.2651 +			
 30.2652 +				if ( queue(this, type).length == 1 )
 30.2653 +					fn.apply(this);
 30.2654 +			}
 30.2655 +		});
 30.2656 +	},
 30.2657 +
 30.2658 +	stop: function(){
 30.2659 +		var timers = jQuery.timers;
 30.2660 +
 30.2661 +		return this.each(function(){
 30.2662 +			for ( var i = 0; i < timers.length; i++ )
 30.2663 +				if ( timers[i].elem == this )
 30.2664 +					timers.splice(i--, 1);
 30.2665 +		}).dequeue();
 30.2666 +	}
 30.2667 +
 30.2668 +});
 30.2669 +
 30.2670 +var queue = function( elem, type, array ) {
 30.2671 +	if ( !elem )
 30.2672 +		return;
 30.2673 +
 30.2674 +	var q = jQuery.data( elem, type + "queue" );
 30.2675 +
 30.2676 +	if ( !q || array )
 30.2677 +		q = jQuery.data( elem, type + "queue", 
 30.2678 +			array ? jQuery.makeArray(array) : [] );
 30.2679 +
 30.2680 +	return q;
 30.2681 +};
 30.2682 +
 30.2683 +jQuery.fn.dequeue = function(type){
 30.2684 +	type = type || "fx";
 30.2685 +
 30.2686 +	return this.each(function(){
 30.2687 +		var q = queue(this, type);
 30.2688 +
 30.2689 +		q.shift();
 30.2690 +
 30.2691 +		if ( q.length )
 30.2692 +			q[0].apply( this );
 30.2693 +	});
 30.2694 +};
 30.2695 +
 30.2696 +jQuery.extend({
 30.2697 +	
 30.2698 +	speed: function(speed, easing, fn) {
 30.2699 +		var opt = speed && speed.constructor == Object ? speed : {
 30.2700 +			complete: fn || !fn && easing || 
 30.2701 +				jQuery.isFunction( speed ) && speed,
 30.2702 +			duration: speed,
 30.2703 +			easing: fn && easing || easing && easing.constructor != Function && easing
 30.2704 +		};
 30.2705 +
 30.2706 +		opt.duration = (opt.duration && opt.duration.constructor == Number ? 
 30.2707 +			opt.duration : 
 30.2708 +			{ slow: 600, fast: 200 }[opt.duration]) || 400;
 30.2709 +	
 30.2710 +		// Queueing
 30.2711 +		opt.old = opt.complete;
 30.2712 +		opt.complete = function(){
 30.2713 +			jQuery(this).dequeue();
 30.2714 +			if ( jQuery.isFunction( opt.old ) )
 30.2715 +				opt.old.apply( this );
 30.2716 +		};
 30.2717 +	
 30.2718 +		return opt;
 30.2719 +	},
 30.2720 +	
 30.2721 +	easing: {
 30.2722 +		linear: function( p, n, firstNum, diff ) {
 30.2723 +			return firstNum + diff * p;
 30.2724 +		},
 30.2725 +		swing: function( p, n, firstNum, diff ) {
 30.2726 +			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 30.2727 +		}
 30.2728 +	},
 30.2729 +	
 30.2730 +	timers: [],
 30.2731 +
 30.2732 +	fx: function( elem, options, prop ){
 30.2733 +		this.options = options;
 30.2734 +		this.elem = elem;
 30.2735 +		this.prop = prop;
 30.2736 +
 30.2737 +		if ( !options.orig )
 30.2738 +			options.orig = {};
 30.2739 +	}
 30.2740 +
 30.2741 +});
 30.2742 +
 30.2743 +jQuery.fx.prototype = {
 30.2744 +
 30.2745 +	// Simple function for setting a style value
 30.2746 +	update: function(){
 30.2747 +		if ( this.options.step )
 30.2748 +			this.options.step.apply( this.elem, [ this.now, this ] );
 30.2749 +
 30.2750 +		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 30.2751 +
 30.2752 +		// Set display property to block for height/width animations
 30.2753 +		if ( this.prop == "height" || this.prop == "width" )
 30.2754 +			this.elem.style.display = "block";
 30.2755 +	},
 30.2756 +
 30.2757 +	// Get the current size
 30.2758 +	cur: function(force){
 30.2759 +		if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
 30.2760 +			return this.elem[ this.prop ];
 30.2761 +
 30.2762 +		var r = parseFloat(jQuery.curCSS(this.elem, this.prop, force));
 30.2763 +		return r && r > -10000 ? r : parseFloat(jQuery.css(this.elem, this.prop)) || 0;
 30.2764 +	},
 30.2765 +
 30.2766 +	// Start an animation from one number to another
 30.2767 +	custom: function(from, to, unit){
 30.2768 +		this.startTime = (new Date()).getTime();
 30.2769 +		this.start = from;
 30.2770 +		this.end = to;
 30.2771 +		this.unit = unit || this.unit || "px";
 30.2772 +		this.now = this.start;
 30.2773 +		this.pos = this.state = 0;
 30.2774 +		this.update();
 30.2775 +
 30.2776 +		var self = this;
 30.2777 +		function t(){
 30.2778 +			return self.step();
 30.2779 +		}
 30.2780 +
 30.2781 +		t.elem = this.elem;
 30.2782 +
 30.2783 +		jQuery.timers.push(t);
 30.2784 +
 30.2785 +		if ( jQuery.timers.length == 1 ) {
 30.2786 +			var timer = setInterval(function(){
 30.2787 +				var timers = jQuery.timers;
 30.2788 +				
 30.2789 +				for ( var i = 0; i < timers.length; i++ )
 30.2790 +					if ( !timers[i]() )
 30.2791 +						timers.splice(i--, 1);
 30.2792 +
 30.2793 +				if ( !timers.length )
 30.2794 +					clearInterval( timer );
 30.2795 +			}, 13);
 30.2796 +		}
 30.2797 +	},
 30.2798 +
 30.2799 +	// Simple 'show' function
 30.2800 +	show: function(){
 30.2801 +		// Remember where we started, so that we can go back to it later
 30.2802 +		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 30.2803 +		this.options.show = true;
 30.2804 +
 30.2805 +		// Begin the animation
 30.2806 +		this.custom(0, this.cur());
 30.2807 +
 30.2808 +		// Make sure that we start at a small width/height to avoid any
 30.2809 +		// flash of content
 30.2810 +		if ( this.prop == "width" || this.prop == "height" )
 30.2811 +			this.elem.style[this.prop] = "1px";
 30.2812 +		
 30.2813 +		// Start by showing the element
 30.2814 +		jQuery(this.elem).show();
 30.2815 +	},
 30.2816 +
 30.2817 +	// Simple 'hide' function
 30.2818 +	hide: function(){
 30.2819 +		// Remember where we started, so that we can go back to it later
 30.2820 +		this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 30.2821 +		this.options.hide = true;
 30.2822 +
 30.2823 +		// Begin the animation
 30.2824 +		this.custom(this.cur(), 0);
 30.2825 +	},
 30.2826 +
 30.2827 +	// Each step of an animation
 30.2828 +	step: function(){
 30.2829 +		var t = (new Date()).getTime();
 30.2830 +
 30.2831 +		if ( t > this.options.duration + this.startTime ) {
 30.2832 +			this.now = this.end;
 30.2833 +			this.pos = this.state = 1;
 30.2834 +			this.update();
 30.2835 +
 30.2836 +			this.options.curAnim[ this.prop ] = true;
 30.2837 +
 30.2838 +			var done = true;
 30.2839 +			for ( var i in this.options.curAnim )
 30.2840 +				if ( this.options.curAnim[i] !== true )
 30.2841 +					done = false;
 30.2842 +
 30.2843 +			if ( done ) {
 30.2844 +				if ( this.options.display != null ) {
 30.2845 +					// Reset the overflow
 30.2846 +					this.elem.style.overflow = this.options.overflow;
 30.2847 +				
 30.2848 +					// Reset the display
 30.2849 +					this.elem.style.display = this.options.display;
 30.2850 +					if ( jQuery.css(this.elem, "display") == "none" )
 30.2851 +						this.elem.style.display = "block";
 30.2852 +				}
 30.2853 +
 30.2854 +				// Hide the element if the "hide" operation was done
 30.2855 +				if ( this.options.hide )
 30.2856 +					this.elem.style.display = "none";
 30.2857 +
 30.2858 +				// Reset the properties, if the item has been hidden or shown
 30.2859 +				if ( this.options.hide || this.options.show )
 30.2860 +					for ( var p in this.options.curAnim )
 30.2861 +						jQuery.attr(this.elem.style, p, this.options.orig[p]);
 30.2862 +			}
 30.2863 +
 30.2864 +			// If a callback was provided, execute it
 30.2865 +			if ( done && jQuery.isFunction( this.options.complete ) )
 30.2866 +				// Execute the complete function
 30.2867 +				this.options.complete.apply( this.elem );
 30.2868 +
 30.2869 +			return false;
 30.2870 +		} else {
 30.2871 +			var n = t - this.startTime;
 30.2872 +			this.state = n / this.options.duration;
 30.2873 +
 30.2874 +			// Perform the easing function, defaults to swing
 30.2875 +			this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
 30.2876 +			this.now = this.start + ((this.end - this.start) * this.pos);
 30.2877 +
 30.2878 +			// Perform the next step of the animation
 30.2879 +			this.update();
 30.2880 +		}
 30.2881 +
 30.2882 +		return true;
 30.2883 +	}
 30.2884 +
 30.2885 +};
 30.2886 +
 30.2887 +jQuery.fx.step = {
 30.2888 +	scrollLeft: function(fx){
 30.2889 +		fx.elem.scrollLeft = fx.now;
 30.2890 +	},
 30.2891 +
 30.2892 +	scrollTop: function(fx){
 30.2893 +		fx.elem.scrollTop = fx.now;
 30.2894 +	},
 30.2895 +
 30.2896 +	opacity: function(fx){
 30.2897 +		jQuery.attr(fx.elem.style, "opacity", fx.now);
 30.2898 +	},
 30.2899 +
 30.2900 +	_default: function(fx){
 30.2901 +		fx.elem.style[ fx.prop ] = fx.now + fx.unit;
 30.2902 +	}
 30.2903 +};
 30.2904 +// The Offset Method
 30.2905 +// Originally By Brandon Aaron, part of the Dimension Plugin
 30.2906 +// http://jquery.com/plugins/project/dimensions
 30.2907 +jQuery.fn.offset = function() {
 30.2908 +	var left = 0, top = 0, elem = this[0], results;
 30.2909 +	
 30.2910 +	if ( elem ) with ( jQuery.browser ) {
 30.2911 +		var	absolute     = jQuery.css(elem, "position") == "absolute", 
 30.2912 +		    parent       = elem.parentNode, 
 30.2913 +		    offsetParent = elem.offsetParent, 
 30.2914 +		    doc          = elem.ownerDocument,
 30.2915 +		    safari2      = safari && parseInt(version) < 522;
 30.2916 +	
 30.2917 +		// Use getBoundingClientRect if available
 30.2918 +		if ( elem.getBoundingClientRect ) {
 30.2919 +			box = elem.getBoundingClientRect();
 30.2920 +		
 30.2921 +			// Add the document scroll offsets
 30.2922 +			add(
 30.2923 +				box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 30.2924 +				box.top  + Math.max(doc.documentElement.scrollTop,  doc.body.scrollTop)
 30.2925 +			);
 30.2926 +		
 30.2927 +			// IE adds the HTML element's border, by default it is medium which is 2px
 30.2928 +			// IE 6 and IE 7 quirks mode the border width is overwritable by the following css html { border: 0; }
 30.2929 +			// IE 7 standards mode, the border is always 2px
 30.2930 +			if ( msie ) {
 30.2931 +				var border = jQuery("html").css("borderWidth");
 30.2932 +				border = (border == "medium" || jQuery.boxModel && parseInt(version) >= 7) && 2 || border;
 30.2933 +				add( -border, -border );
 30.2934 +			}
 30.2935 +	
 30.2936 +		// Otherwise loop through the offsetParents and parentNodes
 30.2937 +		} else {
 30.2938 +		
 30.2939 +			// Initial element offsets
 30.2940 +			add( elem.offsetLeft, elem.offsetTop );
 30.2941 +		
 30.2942 +			// Get parent offsets
 30.2943 +			while ( offsetParent ) {
 30.2944 +				// Add offsetParent offsets
 30.2945 +				add( offsetParent.offsetLeft, offsetParent.offsetTop );
 30.2946 +			
 30.2947 +				// Mozilla and Safari > 2 does not include the border on offset parents
 30.2948 +				// However Mozilla adds the border for table cells
 30.2949 +				if ( mozilla && /^t[d|h]$/i.test(parent.tagName) || !safari2 )
 30.2950 +					border( offsetParent );
 30.2951 +				
 30.2952 +				// Safari <= 2 doubles body offsets with an absolutely positioned element or parent
 30.2953 +				if ( safari2 && !absolute && jQuery.css(offsetParent, "position") == "absolute" )
 30.2954 +					absolute = true;
 30.2955 +			
 30.2956 +				// Get next offsetParent
 30.2957 +				offsetParent = offsetParent.offsetParent;
 30.2958 +			}
 30.2959 +		
 30.2960 +			// Get parent scroll offsets
 30.2961 +			while ( parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
 30.2962 +				// Work around opera inline/table scrollLeft/Top bug
 30.2963 +				if ( !/^inline|table-row.*$/i.test(jQuery.css(parent, "display")) )
 30.2964 +					// Subtract parent scroll offsets
 30.2965 +					add( -parent.scrollLeft, -parent.scrollTop );
 30.2966 +			
 30.2967 +				// Mozilla does not add the border for a parent that has overflow != visible
 30.2968 +				if ( mozilla && jQuery.css(parent, "overflow") != "visible" )
 30.2969 +					border( parent );
 30.2970 +			
 30.2971 +				// Get next parent
 30.2972 +				parent = parent.parentNode;
 30.2973 +			}
 30.2974 +		
 30.2975 +			// Safari doubles body offsets with an absolutely positioned element or parent
 30.2976 +			if ( safari2 && absolute )
 30.2977 +				add( -doc.body.offsetLeft, -doc.body.offsetTop );
 30.2978 +		}
 30.2979 +
 30.2980 +		// Return an object with top and left properties
 30.2981 +		results = { top: top, left: left };
 30.2982 +	}
 30.2983 +
 30.2984 +	return results;
 30.2985 +
 30.2986 +	function border(elem) {
 30.2987 +		add( jQuery.css(elem, "borderLeftWidth"), jQuery.css(elem, "borderTopWidth") );
 30.2988 +	}
 30.2989 +
 30.2990 +	function add(l, t) {
 30.2991 +		left += parseInt(l) || 0;
 30.2992 +		top += parseInt(t) || 0;
 30.2993 +	}
 30.2994 +};
 30.2995 +})();
    31.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    31.2 +++ b/web/support/styles/styles.css	Mon Oct 26 14:46:22 2009 +0100
    31.3 @@ -0,0 +1,286 @@
    31.4 +body {
    31.5 +  background: #F2F1F0;
    31.6 +  font-family: verdana,sans-serif;
    31.7 +}
    31.8 +
    31.9 +.navheader, .book, .preface, .chapter, .appendix, .bibliography, .navfooter, .basetemplate {
   31.10 +  width: 50em;
   31.11 +  margin-left: auto;
   31.12 +  margin-right: auto;
   31.13 +}
   31.14 +
   31.15 +a.commenttoggle:hover, a.commenttoggle:active {
   31.16 +  opacity: 0.7;
   31.17 +}
   31.18 +
   31.19 +a:hover, a:active {
   31.20 +  border-bottom: 1px solid #aaaaaa;
   31.21 +}
   31.22 +
   31.23 +.book, .preface, .chapter, .appendix, .bibliography, .basetemplate {
   31.24 +  background: white;
   31.25 +  padding: 2em;
   31.26 +}
   31.27 +
   31.28 +h1 {
   31.29 +  margin-top: 1.5em;
   31.30 +}
   31.31 +
   31.32 +span.beta {
   31.33 +  font-size: 80%;
   31.34 +  font-style: italic;
   31.35 +  opacity: 0.4;
   31.36 +}
   31.37 +
   31.38 +h2, h3 {
   31.39 +  margin-top: 2em;
   31.40 +}
   31.41 +
   31.42 +h1, h2, h3 {
   31.43 +  font-family: georgia,serif;
   31.44 +  font-weight: normal;
   31.45 +  margin-bottom: 0.5em;
   31.46 +}
   31.47 +
   31.48 +h1.booktitle {
   31.49 +  margin-bottom: 0px;
   31.50 +}
   31.51 +
   31.52 +h2.booktitle {
   31.53 +  text-align: center;
   31.54 +}
   31.55 +
   31.56 +h2.booktitle > a {
   31.57 +  color: black;
   31.58 +}
   31.59 +
   31.60 +.authors {
   31.61 +  font-size: 80%;
   31.62 +  opacity: 0.55;
   31.63 +  padding-left: 0.5em;
   31.64 +}
   31.65 +
   31.66 +div.note th, div.tip th, div.warning th {
   31.67 +  font-family: georgia,serif;
   31.68 +  font-weight: normal;
   31.69 +  font-size: 110%;
   31.70 +}
   31.71 +
   31.72 +div.navheader th, div.navfooter td {
   31.73 +  font-family: georgia,serif;
   31.74 +}
   31.75 +
   31.76 +div.navheader th {
   31.77 +  opacity: 0;
   31.78 +  font-size: 0;
   31.79 +}
   31.80 +
   31.81 +pre.screen {
   31.82 +  background-image: url(figs/shell.png);
   31.83 +}
   31.84 +
   31.85 +pre.programlisting {
   31.86 +  background-image: url(figs/source.png);
   31.87 +}
   31.88 +
   31.89 +pre.programlisting, pre.screen, p.remark {
   31.90 +  border-style: solid;
   31.91 +  border-width: 1px;
   31.92 +  font-size: medium;
   31.93 +  padding: 1em;
   31.94 +  background-repeat: no-repeat;
   31.95 +  background-position: 10px 10px;
   31.96 +  padding-left: 70px;
   31.97 +}
   31.98 +
   31.99 +strong.command, code, pre, span.type {
  31.100 +  font-family: monospace;
  31.101 +  font-weight: normal;
  31.102 +}
  31.103 +
  31.104 +strong.userinput > code {
  31.105 +  font-weight: bolder;
  31.106 +  color: #303030;
  31.107 +}
  31.108 +
  31.109 +div.toc > p {
  31.110 +  opacity: 0.35;
  31.111 +  font-family: georgia,serif;
  31.112 +  cursor: pointer;
  31.113 +}
  31.114 +
  31.115 +div.toc b {
  31.116 +  font-weight: normal;
  31.117 +  font-size: large;
  31.118 +}
  31.119 +
  31.120 +ul.booktoc {
  31.121 +  padding-left: 0px;
  31.122 +  list-style-type: none;
  31.123 +}
  31.124 +
  31.125 +.booktoc > li {
  31.126 +  padding: 0.5em;
  31.127 +}
  31.128 +
  31.129 +.chapinfo {
  31.130 +  float: right;
  31.131 +  color: #a0a0a0;
  31.132 +}
  31.133 +
  31.134 +.unpublished {
  31.135 +  color: #a0a0a0;
  31.136 +}
  31.137 +
  31.138 +.chapinfo img {
  31.139 +  vertical-align: -35%;
  31.140 +  border: 0px;
  31.141 +}
  31.142 +
  31.143 +.zebra_b {
  31.144 +  background: #f4f4f4;
  31.145 +}
  31.146 +
  31.147 +.book .titlepage {
  31.148 +  display: none;
  31.149 +}
  31.150 +
  31.151 +.chapter div.toc > dl {
  31.152 +  display: none;
  31.153 +}
  31.154 +
  31.155 +pre.programlisting, pre.screen, p.remark {
  31.156 +  overflow: hidden;
  31.157 +}
  31.158 +
  31.159 +p.remark {
  31.160 +  background-image: url(figs/remark.png);
  31.161 +}
  31.162 +
  31.163 +div.warning, p.remark {
  31.164 +  background-color: #FFEFE8;
  31.165 +  border-color: #e0a8a0;
  31.166 +}
  31.167 +
  31.168 +span.remark {
  31.169 +  font-style: normal;
  31.170 +  color: #707070;
  31.171 +}
  31.172 +
  31.173 +.screen {
  31.174 +  background: #e7ffc7 none repeat scroll 0% 50%;
  31.175 +  border-color: #94DA3A;
  31.176 +}
  31.177 +
  31.178 +.programlisting {
  31.179 +  background: #F0F4FF none repeat scroll 0% 50%;
  31.180 +  border-color: #B4BAEA;
  31.181 +}
  31.182 +
  31.183 +.prompt {
  31.184 +  color: #448844;
  31.185 +}
  31.186 +
  31.187 +div.note, div.tip {
  31.188 +  background: #ffffc9;
  31.189 +  border-color: #B4BAEA;
  31.190 +}
  31.191 +
  31.192 +div.note, div.warning, div.tip {
  31.193 +  border-style: solid;
  31.194 +  border-width: 1px;
  31.195 +  padding: 1em;
  31.196 +}
  31.197 +
  31.198 +.note .title {
  31.199 +  font-size: 90%;
  31.200 +}
  31.201 +
  31.202 +.comment {
  31.203 +  font-size: 80%;
  31.204 +}
  31.205 +
  31.206 +div.comment, div.new_comment {
  31.207 +  padding: 0.5em;
  31.208 +  margin: 0.5em;
  31.209 +  margin-left: 2em;
  31.210 +  border-style: solid;
  31.211 +  border-width: 1px;
  31.212 +  border-color: #aaaaff;
  31.213 +}
  31.214 +
  31.215 +div.comment {
  31.216 +  background: #eeeeff;
  31.217 +}
  31.218 +
  31.219 +div.new_comment {
  31.220 +  background: #d0d0ff;
  31.221 +}
  31.222 +
  31.223 +.commenttoggle {
  31.224 +  opacity: 0.35;
  31.225 +}
  31.226 +
  31.227 +.comment_help {
  31.228 +  font-size: 80%;
  31.229 +}
  31.230 +
  31.231 +.comment_header {
  31.232 +  opacity: 0.75;
  31.233 +}
  31.234 +
  31.235 +.comment_id {
  31.236 +  float: right;
  31.237 +  opacity: 0.3;
  31.238 +  font-size: 60%;
  31.239 +}
  31.240 +
  31.241 +.comment_name {
  31.242 +  font-weight: bolder;
  31.243 +}
  31.244 +
  31.245 +.comment_reviewed {
  31.246 +  color: darkgreen;
  31.247 +  margin-left: 1em;
  31.248 +  font-style: italic;
  31.249 +}
  31.250 +
  31.251 +.comment_date {
  31.252 +  opacity: 0.75;
  31.253 +}
  31.254 +
  31.255 +.comment_thanks {
  31.256 +  color: darkblue;
  31.257 +  margin-left: 1em;
  31.258 +  font-style: italic;
  31.259 +  font-weight: bolder;
  31.260 +}
  31.261 +
  31.262 +.comment_error {
  31.263 +  padding-left: 1em;
  31.264 +  font-weight: bolder;
  31.265 +  font-size: 80%;
  31.266 +  color: darkred;
  31.267 +}
  31.268 +
  31.269 +.hgfooter {
  31.270 +  width: 60em;
  31.271 +  margin-left: auto;
  31.272 +  margin-right: auto;
  31.273 +  margin-top: 2em;
  31.274 +  margin-bottom: 2em;
  31.275 +  font-size: 80%;
  31.276 +  color: #727272;
  31.277 +}
  31.278 +
  31.279 +.hgfooter a {
  31.280 +  color: #5555ff;
  31.281 +}
  31.282 +
  31.283 +.hgfooter a:visited {
  31.284 +  opacity: 0.7;
  31.285 +}
  31.286 +
  31.287 +.hgfooter img {
  31.288 +  vertical-align: -45%;
  31.289 +}