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