jquery.js
上传用户:shjgzm
上传日期:2017-08-31
资源大小:2757k
文件大小:48k
源码类别:

Ajax

开发平台:

Java

  1. /* prevent execution of jQuery if included more then once */
  2. if(typeof window.jQuery == "undefined") {
  3. /*
  4.  * jQuery 1.0.2 - New Wave Javascript
  5.  *
  6.  * Copyright (c) 2006 John Resig (jquery.com)
  7.  * Dual licensed under the MIT (MIT-LICENSE.txt)
  8.  * and GPL (GPL-LICENSE.txt) licenses.
  9.  *
  10.  * $Date: 2006-10-09 21:59:20 -0400 (Mon, 09 Oct 2006) $
  11.  * $Rev: 415 $
  12.  */
  13. // Global undefined variable
  14. window.undefined = window.undefined;
  15. jQuery = function(a,c) {
  16. // Shortcut for document ready (because $(document).each() is silly)
  17. if ( a && typeof a == "function" && jQuery.fn.ready )
  18. return jQuery(document).ready(a);
  19. // Make sure that a selection was provided
  20. a = a || jQuery.context || document;
  21. // Watch for when a jQuery object is passed as the selector
  22. if ( a.jquery )
  23. return jQuery( jQuery.merge( a, [] ) );
  24. // Watch for when a jQuery object is passed at the context
  25. if ( c && c.jquery )
  26. return jQuery( c ).find(a);
  27. // If the context is global, return a new object
  28. if ( window == this )
  29. return new jQuery(a,c);
  30. // Handle HTML strings
  31. var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
  32. if ( m ) a = jQuery.clean( [ m[1] ] );
  33. // Watch for when an array is passed in
  34. this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
  35. // Assume that it is an array of DOM Elements
  36. jQuery.merge( a, [] ) :
  37. // Find the matching elements and save them for later
  38. jQuery.find( a, c ) );
  39.   // See if an extra function was provided
  40. var fn = arguments[ arguments.length - 1 ];
  41. // If so, execute it in context
  42. if ( fn && typeof fn == "function" )
  43. this.each(fn);
  44. };
  45. // Map over the $ in case of overwrite
  46. if ( typeof $ != "undefined" )
  47. jQuery._$ = $;
  48. // Map the jQuery namespace to the '$' one
  49. var $ = jQuery;
  50. jQuery.fn = jQuery.prototype = {
  51. jquery: "1.0.2",
  52. size: function() {
  53. return this.length;
  54. },
  55. get: function( num ) {
  56. // Watch for when an array (of elements) is passed in
  57. if ( num && num.constructor == Array ) {
  58. // Use a tricky hack to make the jQuery object
  59. // look and feel like an array
  60. this.length = 0;
  61. [].push.apply( this, num );
  62. return this;
  63. } else
  64. return num == undefined ?
  65. // Return a 'clean' array
  66. jQuery.merge( this, [] ) :
  67. // Return just the object
  68. this[num];
  69. },
  70. each: function( fn, args ) {
  71. return jQuery.each( this, fn, args );
  72. },
  73. index: function( obj ) {
  74. var pos = -1;
  75. this.each(function(i){
  76. if ( this == obj ) pos = i;
  77. });
  78. return pos;
  79. },
  80. attr: function( key, value, type ) {
  81. // Check to see if we're setting style values
  82. return key.constructor != String || value != undefined ?
  83. this.each(function(){
  84. // See if we're setting a hash of styles
  85. if ( value == undefined )
  86. // Set all the styles
  87. for ( var prop in key )
  88. jQuery.attr(
  89. type ? this.style : this,
  90. prop, key[prop]
  91. );
  92. // See if we're setting a single key/value style
  93. else
  94. jQuery.attr(
  95. type ? this.style : this,
  96. key, value
  97. );
  98. }) :
  99. // Look for the case where we're accessing a style value
  100. jQuery[ type || "attr" ]( this[0], key );
  101. },
  102. css: function( key, value ) {
  103. return this.attr( key, value, "curCSS" );
  104. },
  105. text: function(e) {
  106. e = e || this;
  107. var t = "";
  108. for ( var j = 0; j < e.length; j++ ) {
  109. var r = e[j].childNodes;
  110. for ( var i = 0; i < r.length; i++ )
  111. if ( r[i].nodeType != 8 )
  112. t += r[i].nodeType != 1 ?
  113. r[i].nodeValue : jQuery.fn.text([ r[i] ]);
  114. }
  115. return t;
  116. },
  117. wrap: function() {
  118. // The elements to wrap the target around
  119. var a = jQuery.clean(arguments);
  120. // Wrap each of the matched elements individually
  121. return this.each(function(){
  122. // Clone the structure that we're using to wrap
  123. var b = a[0].cloneNode(true);
  124. // Insert it before the element to be wrapped
  125. this.parentNode.insertBefore( b, this );
  126. // Find the deepest point in the wrap structure
  127. while ( b.firstChild )
  128. b = b.firstChild;
  129. // Move the matched element to within the wrap structure
  130. b.appendChild( this );
  131. });
  132. },
  133. append: function() {
  134. return this.domManip(arguments, true, 1, function(a){
  135. this.appendChild( a );
  136. });
  137. },
  138. prepend: function() {
  139. return this.domManip(arguments, true, -1, function(a){
  140. this.insertBefore( a, this.firstChild );
  141. });
  142. },
  143. before: function() {
  144. return this.domManip(arguments, false, 1, function(a){
  145. this.parentNode.insertBefore( a, this );
  146. });
  147. },
  148. after: function() {
  149. return this.domManip(arguments, false, -1, function(a){
  150. this.parentNode.insertBefore( a, this.nextSibling );
  151. });
  152. },
  153. end: function() {
  154. return this.get( this.stack.pop() );
  155. },
  156. find: function(t) {
  157. return this.pushStack( jQuery.map( this, function(a){
  158. return jQuery.find(t,a);
  159. }), arguments );
  160. },
  161. clone: function(deep) {
  162. return this.pushStack( jQuery.map( this, function(a){
  163. return a.cloneNode( deep != undefined ? deep : true );
  164. }), arguments );
  165. },
  166. filter: function(t) {
  167. return this.pushStack(
  168. t.constructor == Array &&
  169. jQuery.map(this,function(a){
  170. for ( var i = 0; i < t.length; i++ )
  171. if ( jQuery.filter(t[i],[a]).r.length )
  172. return a;
  173. }) ||
  174. t.constructor == Boolean &&
  175. ( t ? this.get() : [] ) ||
  176. typeof t == "function" &&
  177. jQuery.grep( this, t ) ||
  178. jQuery.filter(t,this).r, arguments );
  179. },
  180. not: function(t) {
  181. return this.pushStack( t.constructor == String ?
  182. jQuery.filter(t,this,false).r :
  183. jQuery.grep(this,function(a){ return a != t; }), arguments );
  184. },
  185. add: function(t) {
  186. return this.pushStack( jQuery.merge( this, t.constructor == String ?
  187. jQuery.find(t) : t.constructor == Array ? t : [t] ), arguments );
  188. },
  189. is: function(expr) {
  190. return expr ? jQuery.filter(expr,this).r.length > 0 : false;
  191. },
  192. domManip: function(args, table, dir, fn){
  193. var clone = this.size() > 1;
  194. var a = jQuery.clean(args);
  195. return this.each(function(){
  196. var obj = this;
  197. if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() != "THEAD" ) {
  198. var tbody = this.getElementsByTagName("tbody");
  199. if ( !tbody.length ) {
  200. obj = document.createElement("tbody");
  201. this.appendChild( obj );
  202. } else
  203. obj = tbody[0];
  204. }
  205. for ( var i = ( dir < 0 ? a.length - 1 : 0 );
  206. i != ( dir < 0 ? dir : a.length ); i += dir ) {
  207. fn.apply( obj, [ clone ? a[i].cloneNode(true) : a[i] ] );
  208. }
  209. });
  210. },
  211. pushStack: function(a,args) {
  212. var fn = args && args[args.length-1];
  213. var fn2 = args && args[args.length-2];
  214. if ( fn && fn.constructor != Function ) fn = null;
  215. if ( fn2 && fn2.constructor != Function ) fn2 = null;
  216. if ( !fn ) {
  217. if ( !this.stack ) this.stack = [];
  218. this.stack.push( this.get() );
  219. this.get( a );
  220. } else {
  221. var old = this.get();
  222. this.get( a );
  223. if ( fn2 && a.length || !fn2 )
  224. this.each( fn2 || fn ).get( old );
  225. else
  226. this.get( old ).each( fn );
  227. }
  228. return this;
  229. }
  230. };
  231. jQuery.extend = jQuery.fn.extend = function(obj,prop) {
  232. if ( !prop ) { prop = obj; obj = this; }
  233. for ( var i in prop ) obj[i] = prop[i];
  234. return obj;
  235. };
  236. jQuery.extend({
  237. init: function(){
  238. jQuery.initDone = true;
  239. jQuery.each( jQuery.macros.axis, function(i,n){
  240. jQuery.fn[ i ] = function(a) {
  241. var ret = jQuery.map(this,n);
  242. if ( a && a.constructor == String )
  243. ret = jQuery.filter(a,ret).r;
  244. return this.pushStack( ret, arguments );
  245. };
  246. });
  247. jQuery.each( jQuery.macros.to, function(i,n){
  248. jQuery.fn[ i ] = function(){
  249. var a = arguments;
  250. return this.each(function(){
  251. for ( var j = 0; j < a.length; j++ )
  252. jQuery(a[j])[n]( this );
  253. });
  254. };
  255. });
  256. jQuery.each( jQuery.macros.each, function(i,n){
  257. jQuery.fn[ i ] = function() {
  258. return this.each( n, arguments );
  259. };
  260. });
  261. jQuery.each( jQuery.macros.filter, function(i,n){
  262. jQuery.fn[ n ] = function(num,fn) {
  263. return this.filter( ":" + n + "(" + num + ")", fn );
  264. };
  265. });
  266. jQuery.each( jQuery.macros.attr, function(i,n){
  267. n = n || i;
  268. jQuery.fn[ i ] = function(h) {
  269. return h == undefined ?
  270. this.length ? this[0][n] : null :
  271. this.attr( n, h );
  272. };
  273. });
  274. jQuery.each( jQuery.macros.css, function(i,n){
  275. jQuery.fn[ n ] = function(h) {
  276. return h == undefined ?
  277. ( this.length ? jQuery.css( this[0], n ) : null ) :
  278. this.css( n, h );
  279. };
  280. });
  281. },
  282. each: function( obj, fn, args ) {
  283. if ( obj.length == undefined )
  284. for ( var i in obj )
  285. fn.apply( obj[i], args || [i, obj[i]] );
  286. else
  287. for ( var i = 0; i < obj.length; i++ )
  288. fn.apply( obj[i], args || [i, obj[i]] );
  289. return obj;
  290. },
  291. className: {
  292. add: function(o,c){
  293. if (jQuery.className.has(o,c)) return;
  294. o.className += ( o.className ? " " : "" ) + c;
  295. },
  296. remove: function(o,c){
  297. if( !c ) {
  298. o.className = "";
  299. } else {
  300. var classes = o.className.split(" ");
  301. for(var i=0; i<classes.length; i++) {
  302. if(classes[i] == c) {
  303. classes.splice(i, 1);
  304. break;
  305. }
  306. }
  307. o.className = classes.join(' ');
  308. }
  309. },
  310. has: function(e,a) {
  311. if ( e.className != undefined )
  312. e = e.className;
  313. return new RegExp("(^|\s)" + a + "(\s|$)").test(e);
  314. }
  315. },
  316. swap: function(e,o,f) {
  317. for ( var i in o ) {
  318. e.style["old"+i] = e.style[i];
  319. e.style[i] = o[i];
  320. }
  321. f.apply( e, [] );
  322. for ( var i in o )
  323. e.style[i] = e.style["old"+i];
  324. },
  325. css: function(e,p) {
  326. if ( p == "height" || p == "width" ) {
  327. var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
  328. for ( var i in d ) {
  329. old["padding" + d[i]] = 0;
  330. old["border" + d[i] + "Width"] = 0;
  331. }
  332. jQuery.swap( e, old, function() {
  333. if (jQuery.css(e,"display") != "none") {
  334. oHeight = e.offsetHeight;
  335. oWidth = e.offsetWidth;
  336. } else {
  337. e = jQuery(e.cloneNode(true)).css({
  338. visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
  339. }).appendTo(e.parentNode)[0];
  340. var parPos = jQuery.css(e.parentNode,"position");
  341. if ( parPos == "" || parPos == "static" )
  342. e.parentNode.style.position = "relative";
  343. oHeight = e.clientHeight;
  344. oWidth = e.clientWidth;
  345. if ( parPos == "" || parPos == "static" )
  346. e.parentNode.style.position = "static";
  347. e.parentNode.removeChild(e);
  348. }
  349. });
  350. return p == "height" ? oHeight : oWidth;
  351. }
  352. return jQuery.curCSS( e, p );
  353. },
  354. curCSS: function(elem, prop, force) {
  355. var ret;
  356. if (prop == 'opacity' && jQuery.browser.msie)
  357. return jQuery.attr(elem.style, 'opacity');
  358. if (!force && elem.style[prop]) {
  359. ret = elem.style[prop];
  360. } else if (elem.currentStyle) {
  361. var newProp = prop.replace(/-(w)/g,function(m,c){return c.toUpperCase();});
  362. ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
  363. } else if (document.defaultView && document.defaultView.getComputedStyle) {
  364. prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
  365. var cur = document.defaultView.getComputedStyle(elem, null);
  366. if ( cur )
  367. ret = cur.getPropertyValue(prop);
  368. else if ( prop == 'display' )
  369. ret = 'none';
  370. else
  371. jQuery.swap(elem, { display: 'block' }, function() {
  372. ret = document.defaultView.getComputedStyle(this,null).getPropertyValue(prop);
  373. });
  374. }
  375. return ret;
  376. },
  377. clean: function(a) {
  378. var r = [];
  379. for ( var i = 0; i < a.length; i++ ) {
  380. if ( a[i].constructor == String ) {
  381. // trim whitespace, otherwise indexOf won't work as expected
  382. a[i] = jQuery.trim(a[i]);
  383. var table = "";
  384. if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
  385. table = "thead";
  386. a[i] = "<table>" + a[i] + "</table>";
  387. } else if ( !a[i].indexOf("<tr") ) {
  388. table = "tr";
  389. a[i] = "<table>" + a[i] + "</table>";
  390. } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
  391. table = "td";
  392. a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
  393. }
  394. var div = document.createElement("div");
  395. div.innerHTML = a[i];
  396. if ( table ) {
  397. div = div.firstChild;
  398. if ( table != "thead" ) div = div.firstChild;
  399. if ( table == "td" ) div = div.firstChild;
  400. }
  401. for ( var j = 0; j < div.childNodes.length; j++ )
  402. r.push( div.childNodes[j] );
  403. } else if ( a[i].jquery || a[i].length && !a[i].nodeType )
  404. for ( var k = 0; k < a[i].length; k++ )
  405. r.push( a[i][k] );
  406. else if ( a[i] !== null )
  407. r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
  408. }
  409. return r;
  410. },
  411. expr: {
  412. "": "m[2]== '*'||a.nodeName.toUpperCase()==m[2].toUpperCase()",
  413. "#": "a.getAttribute('id')&&a.getAttribute('id')==m[2]",
  414. ":": {
  415. // Position Checks
  416. lt: "i<m[3]-0",
  417. gt: "i>m[3]-0",
  418. nth: "m[3]-0==i",
  419. eq: "m[3]-0==i",
  420. first: "i==0",
  421. last: "i==r.length-1",
  422. even: "i%2==0",
  423. odd: "i%2",
  424. // Child Checks
  425. "nth-child": "jQuery.sibling(a,m[3]).cur",
  426. "first-child": "jQuery.sibling(a,0).cur",
  427. "last-child": "jQuery.sibling(a,0).last",
  428. "only-child": "jQuery.sibling(a).length==1",
  429. // Parent Checks
  430. parent: "a.childNodes.length",
  431. empty: "!a.childNodes.length",
  432. // Text Check
  433. contains: "(a.innerText||a.innerHTML).indexOf(m[3])>=0",
  434. // Visibility
  435. visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
  436. hidden: "a.type=='hidden'||jQuery.css(a,'display')=='none'||jQuery.css(a,'visibility')=='hidden'",
  437. // Form attributes
  438. enabled: "!a.disabled",
  439. disabled: "a.disabled",
  440. checked: "a.checked",
  441. selected: "a.selected || jQuery.attr(a, 'selected')",
  442. // Form elements
  443. text: "a.type=='text'",
  444. radio: "a.type=='radio'",
  445. checkbox: "a.type=='checkbox'",
  446. file: "a.type=='file'",
  447. password: "a.type=='password'",
  448. submit: "a.type=='submit'",
  449. image: "a.type=='image'",
  450. reset: "a.type=='reset'",
  451. button: "a.type=='button'",
  452. input: "a.nodeName.toLowerCase().match(/input|select|textarea|button/)"
  453. },
  454. ".": "jQuery.className.has(a,m[2])",
  455. "@": {
  456. "=": "z==m[4]",
  457. "!=": "z!=m[4]",
  458. "^=": "z && !z.indexOf(m[4])",
  459. "$=": "z && z.substr(z.length - m[4].length,m[4].length)==m[4]",
  460. "*=": "z && z.indexOf(m[4])>=0",
  461. "": "z"
  462. },
  463. "[": "jQuery.find(m[2],a).length"
  464. },
  465. token: [
  466. "\.\.|/\.\.", "a.parentNode",
  467. ">|/", "jQuery.sibling(a.firstChild)",
  468. "\+", "jQuery.sibling(a).next",
  469. "~", function(a){
  470. var r = [];
  471. var s = jQuery.sibling(a);
  472. if ( s.n > 0 )
  473. for ( var i = s.n; i < s.length; i++ )
  474. r.push( s[i] );
  475. return r;
  476. }
  477. ],
  478. find: function( t, context ) {
  479. // Make sure that the context is a DOM Element
  480. if ( context && context.nodeType == undefined )
  481. context = null;
  482. // Set the correct context (if none is provided)
  483. context = context || jQuery.context || document;
  484. if ( t.constructor != String ) return [t];
  485. if ( !t.indexOf("//") ) {
  486. context = context.documentElement;
  487. t = t.substr(2,t.length);
  488. } else if ( !t.indexOf("/") ) {
  489. context = context.documentElement;
  490. t = t.substr(1,t.length);
  491. // FIX Assume the root element is right :(
  492. if ( t.indexOf("/") >= 1 )
  493. t = t.substr(t.indexOf("/"),t.length);
  494. }
  495. var ret = [context];
  496. var done = [];
  497. var last = null;
  498. while ( t.length > 0 && last != t ) {
  499. var r = [];
  500. last = t;
  501. t = jQuery.trim(t).replace( /^///i, "" );
  502. var foundToken = false;
  503. for ( var i = 0; i < jQuery.token.length; i += 2 ) {
  504. if ( foundToken ) continue;
  505. var re = new RegExp("^(" + jQuery.token[i] + ")");
  506. var m = re.exec(t);
  507. if ( m ) {
  508. r = ret = jQuery.map( ret, jQuery.token[i+1] );
  509. t = jQuery.trim( t.replace( re, "" ) );
  510. foundToken = true;
  511. }
  512. }
  513. if ( !foundToken ) {
  514. if ( !t.indexOf(",") || !t.indexOf("|") ) {
  515. if ( ret[0] == context ) ret.shift();
  516. done = jQuery.merge( done, ret );
  517. r = ret = [context];
  518. t = " " + t.substr(1,t.length);
  519. } else {
  520. var re2 = /^([#.]?)([a-z0-9\*_-]*)/i;
  521. var m = re2.exec(t);
  522. if ( m[1] == "#" ) {
  523. // Ummm, should make this work in all XML docs
  524. var oid = document.getElementById(m[2]);
  525. r = ret = oid ? [oid] : [];
  526. t = t.replace( re2, "" );
  527. } else {
  528. if ( !m[2] || m[1] == "." ) m[2] = "*";
  529. for ( var i = 0; i < ret.length; i++ )
  530. r = jQuery.merge( r,
  531. m[2] == "*" ?
  532. jQuery.getAll(ret[i]) :
  533. ret[i].getElementsByTagName(m[2])
  534. );
  535. }
  536. }
  537. }
  538. if ( t ) {
  539. var val = jQuery.filter(t,r);
  540. ret = r = val.r;
  541. t = jQuery.trim(val.t);
  542. }
  543. }
  544. if ( ret && ret[0] == context ) ret.shift();
  545. done = jQuery.merge( done, ret );
  546. return done;
  547. },
  548. getAll: function(o,r) {
  549. r = r || [];
  550. var s = o.childNodes;
  551. for ( var i = 0; i < s.length; i++ )
  552. if ( s[i].nodeType == 1 ) {
  553. r.push( s[i] );
  554. jQuery.getAll( s[i], r );
  555. }
  556. return r;
  557. },
  558. attr: function(elem, name, value){
  559. var fix = {
  560. "for": "htmlFor",
  561. "class": "className",
  562. "float": "cssFloat",
  563. innerHTML: "innerHTML",
  564. className: "className",
  565. value: "value",
  566. disabled: "disabled",
  567. checked: "checked"
  568. };
  569. // IE actually uses filters for opacity ... elem is actually elem.style
  570. if (name == "opacity" && jQuery.browser.msie && value != undefined) {
  571. // IE has trouble with opacity if it does not have layout
  572. // Would prefer to check element.hasLayout first but don't have access to the element here
  573. elem['zoom'] = 1; 
  574. if (value == 1) // Remove filter to avoid more IE weirdness
  575. return elem["filter"] = elem["filter"].replace(/alpha([^)]*)/gi,"");
  576. else
  577. return elem["filter"] = elem["filter"].replace(/alpha([^)]*)/gi,"") + "alpha(opacity=" + value * 100 + ")";
  578. } else if (name == "opacity" && jQuery.browser.msie) {
  579. return elem["filter"] ? parseFloat( elem["filter"].match(/alpha(opacity=(.*))/)[1] )/100 : 1;
  580. }
  581. // Mozilla doesn't play well with opacity 1
  582. if (name == "opacity" && jQuery.browser.mozilla && value == 1) value = 0.9999;
  583. if ( fix[name] ) {
  584. if ( value != undefined ) elem[fix[name]] = value;
  585. return elem[fix[name]];
  586. } else if( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) {
  587. return elem.getAttributeNode(name).nodeValue;
  588. } else if ( elem.getAttribute != undefined ) {
  589. if ( value != undefined ) elem.setAttribute( name, value );
  590. return elem.getAttribute( name, 2 );
  591. } else {
  592. name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
  593. if ( value != undefined ) elem[name] = value;
  594. return elem[name];
  595. }
  596. },
  597. // The regular expressions that power the parsing engine
  598. parse: [
  599. // Match: [@value='test'], [@foo]
  600. "\[ *(@)S *([!*$^=]*) *('?"?)(.*?)\4 *\]",
  601. // Match: [div], [div p]
  602. "(\[)s*(.*?)s*\]",
  603. // Match: :contains('foo')
  604. "(:)S\("?'?([^\)]*?)"?'?\)",
  605. // Match: :even, :last-chlid
  606. "([:.#]*)S"
  607. ],
  608. filter: function(t,r,not) {
  609. // Figure out if we're doing regular, or inverse, filtering
  610. var g = not !== false ? jQuery.grep :
  611. function(a,f) {return jQuery.grep(a,f,true);};
  612. while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
  613. var p = jQuery.parse;
  614. for ( var i = 0; i < p.length; i++ ) {
  615. // Look for, and replace, string-like sequences
  616. // and finally build a regexp out of it
  617. var re = new RegExp(
  618. "^" + p[i].replace("S", "([a-z*_-][a-z0-9_-]*)"), "i" );
  619. var m = re.exec( t );
  620. if ( m ) {
  621. // Re-organize the first match
  622. if ( !i )
  623. m = ["",m[1], m[3], m[2], m[5]];
  624. // Remove what we just matched
  625. t = t.replace( re, "" );
  626. break;
  627. }
  628. }
  629. // :not() is a special case that can be optimized by
  630. // keeping it out of the expression list
  631. if ( m[1] == ":" && m[2] == "not" )
  632. r = jQuery.filter(m[3],r,false).r;
  633. // Otherwise, find the expression to execute
  634. else {
  635. var f = jQuery.expr[m[1]];
  636. if ( f.constructor != String )
  637. f = jQuery.expr[m[1]][m[2]];
  638. // Build a custom macro to enclose it
  639. eval("f = function(a,i){" +
  640. ( m[1] == "@" ? "z=jQuery.attr(a,m[3]);" : "" ) +
  641. "return " + f + "}");
  642. // Execute it against the current filter
  643. r = g( r, f );
  644. }
  645. }
  646. // Return an array of filtered elements (r)
  647. // and the modified expression string (t)
  648. return { r: r, t: t };
  649. },
  650. trim: function(t){
  651. return t.replace(/^s+|s+$/g, "");
  652. },
  653. parents: function( elem ){
  654. var matched = [];
  655. var cur = elem.parentNode;
  656. while ( cur && cur != document ) {
  657. matched.push( cur );
  658. cur = cur.parentNode;
  659. }
  660. return matched;
  661. },
  662. sibling: function(elem, pos, not) {
  663. var elems = [];
  664. if(elem) {
  665. var siblings = elem.parentNode.childNodes;
  666. for ( var i = 0; i < siblings.length; i++ ) {
  667. if ( not === true && siblings[i] == elem ) continue;
  668. if ( siblings[i].nodeType == 1 )
  669. elems.push( siblings[i] );
  670. if ( siblings[i] == elem )
  671. elems.n = elems.length - 1;
  672. }
  673. }
  674. return jQuery.extend( elems, {
  675. last: elems.n == elems.length - 1,
  676. cur: pos == "even" && elems.n % 2 == 0 || pos == "odd" && elems.n % 2 || elems[pos] == elem,
  677. prev: elems[elems.n - 1],
  678. next: elems[elems.n + 1]
  679. });
  680. },
  681. merge: function(first, second) {
  682. var result = [];
  683. // Move b over to the new array (this helps to avoid
  684. // StaticNodeList instances)
  685. for ( var k = 0; k < first.length; k++ )
  686. result[k] = first[k];
  687. // Now check for duplicates between a and b and only
  688. // add the unique items
  689. for ( var i = 0; i < second.length; i++ ) {
  690. var noCollision = true;
  691. // The collision-checking process
  692. for ( var j = 0; j < first.length; j++ )
  693. if ( second[i] == first[j] )
  694. noCollision = false;
  695. // If the item is unique, add it
  696. if ( noCollision )
  697. result.push( second[i] );
  698. }
  699. return result;
  700. },
  701. grep: function(elems, fn, inv) {
  702. // If a string is passed in for the function, make a function
  703. // for it (a handy shortcut)
  704. if ( fn.constructor == String )
  705. fn = new Function("a","i","return " + fn);
  706. var result = [];
  707. // Go through the array, only saving the items
  708. // that pass the validator function
  709. for ( var i = 0; i < elems.length; i++ )
  710. if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
  711. result.push( elems[i] );
  712. return result;
  713. },
  714. map: function(elems, fn) {
  715. // If a string is passed in for the function, make a function
  716. // for it (a handy shortcut)
  717. if ( fn.constructor == String )
  718. fn = new Function("a","return " + fn);
  719. var result = [];
  720. // Go through the array, translating each of the items to their
  721. // new value (or values).
  722. for ( var i = 0; i < elems.length; i++ ) {
  723. var val = fn(elems[i],i);
  724. if ( val !== null && val != undefined ) {
  725. if ( val.constructor != Array ) val = [val];
  726. result = jQuery.merge( result, val );
  727. }
  728. }
  729. return result;
  730. },
  731. /*
  732.  * A number of helper functions used for managing events.
  733.  * Many of the ideas behind this code orignated from Dean Edwards' addEvent library.
  734.  */
  735. event: {
  736. // Bind an event to an element
  737. // Original by Dean Edwards
  738. add: function(element, type, handler) {
  739. // For whatever reason, IE has trouble passing the window object
  740. // around, causing it to be cloned in the process
  741. if ( jQuery.browser.msie && element.setInterval != undefined )
  742. element = window;
  743. // Make sure that the function being executed has a unique ID
  744. if ( !handler.guid )
  745. handler.guid = this.guid++;
  746. // Init the element's event structure
  747. if (!element.events)
  748. element.events = {};
  749. // Get the current list of functions bound to this event
  750. var handlers = element.events[type];
  751. // If it hasn't been initialized yet
  752. if (!handlers) {
  753. // Init the event handler queue
  754. handlers = element.events[type] = {};
  755. // Remember an existing handler, if it's already there
  756. if (element["on" + type])
  757. handlers[0] = element["on" + type];
  758. }
  759. // Add the function to the element's handler list
  760. handlers[handler.guid] = handler;
  761. // And bind the global event handler to the element
  762. element["on" + type] = this.handle;
  763. // Remember the function in a global list (for triggering)
  764. if (!this.global[type])
  765. this.global[type] = [];
  766. this.global[type].push( element );
  767. },
  768. guid: 1,
  769. global: {},
  770. // Detach an event or set of events from an element
  771. remove: function(element, type, handler) {
  772. if (element.events)
  773. if (type && element.events[type])
  774. if ( handler )
  775. delete element.events[type][handler.guid];
  776. else
  777. for ( var i in element.events[type] )
  778. delete element.events[type][i];
  779. else
  780. for ( var j in element.events )
  781. this.remove( element, j );
  782. },
  783. trigger: function(type,data,element) {
  784. // Touch up the incoming data
  785. data = data || [];
  786. // Handle a global trigger
  787. if ( !element ) {
  788. var g = this.global[type];
  789. if ( g )
  790. for ( var i = 0; i < g.length; i++ )
  791. this.trigger( type, data, g[i] );
  792. // Handle triggering a single element
  793. } else if ( element["on" + type] ) {
  794. // Pass along a fake event
  795. data.unshift( this.fix({ type: type, target: element }) );
  796. // Trigger the event
  797. element["on" + type].apply( element, data );
  798. }
  799. },
  800. handle: function(event) {
  801. if ( typeof jQuery == "undefined" ) return;
  802. event = event || jQuery.event.fix( window.event );
  803. // If no correct event was found, fail
  804. if ( !event ) return;
  805. var returnValue = true;
  806. var c = this.events[event.type];
  807. var args = [].slice.call( arguments, 1 );
  808. args.unshift( event );
  809. for ( var j in c ) {
  810. if ( c[j].apply( this, args ) === false ) {
  811. event.preventDefault();
  812. event.stopPropagation();
  813. returnValue = false;
  814. }
  815. }
  816. return returnValue;
  817. },
  818. fix: function(event) {
  819. if ( event ) {
  820. event.preventDefault = function() {
  821. this.returnValue = false;
  822. };
  823. event.stopPropagation = function() {
  824. this.cancelBubble = true;
  825. };
  826. }
  827. return event;
  828. }
  829. }
  830. });
  831. new function() {
  832. var b = navigator.userAgent.toLowerCase();
  833. // Figure out what browser is being used
  834. jQuery.browser = {
  835. safari: /webkit/.test(b),
  836. opera: /opera/.test(b),
  837. msie: /msie/.test(b) && !/opera/.test(b),
  838. mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
  839. };
  840. // Check to see if the W3C box model is being used
  841. jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
  842. };
  843. jQuery.macros = {
  844. to: {
  845. appendTo: "append",
  846. prependTo: "prepend",
  847. insertBefore: "before",
  848. insertAfter: "after"
  849. },
  850. css: "width,height,top,left,position,float,overflow,color,background".split(","),
  851. filter: [ "eq", "lt", "gt", "contains" ],
  852. attr: {
  853. val: "value",
  854. html: "innerHTML",
  855. id: null,
  856. title: null,
  857. name: null,
  858. href: null,
  859. src: null,
  860. rel: null
  861. },
  862. axis: {
  863. parent: "a.parentNode",
  864. ancestors: jQuery.parents,
  865. parents: jQuery.parents,
  866. next: "jQuery.sibling(a).next",
  867. prev: "jQuery.sibling(a).prev",
  868. siblings: "jQuery.sibling(a, null, true)",
  869. children: "jQuery.sibling(a.firstChild)"
  870. },
  871. each: {
  872. removeAttr: function( key ) {
  873. this.removeAttribute( key );
  874. },
  875. show: function(){
  876. this.style.display = this.oldblock ? this.oldblock : "";
  877. if ( jQuery.css(this,"display") == "none" )
  878. this.style.display = "block";
  879. },
  880. hide: function(){
  881. this.oldblock = this.oldblock || jQuery.css(this,"display");
  882. if ( this.oldblock == "none" )
  883. this.oldblock = "block";
  884. this.style.display = "none";
  885. },
  886. toggle: function(){
  887. jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ].apply( jQuery(this), arguments );
  888. },
  889. addClass: function(c){
  890. jQuery.className.add(this,c);
  891. },
  892. removeClass: function(c){
  893. jQuery.className.remove(this,c);
  894. },
  895. toggleClass: function( c ){
  896. jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this,c);
  897. },
  898. remove: function(a){
  899. if ( !a || jQuery.filter( a, [this] ).r )
  900. this.parentNode.removeChild( this );
  901. },
  902. empty: function(){
  903. while ( this.firstChild )
  904. this.removeChild( this.firstChild );
  905. },
  906. bind: function( type, fn ) {
  907. if ( fn.constructor == String )
  908. fn = new Function("e", ( !fn.indexOf(".") ? "jQuery(this)" : "return " ) + fn);
  909. jQuery.event.add( this, type, fn );
  910. },
  911. unbind: function( type, fn ) {
  912. jQuery.event.remove( this, type, fn );
  913. },
  914. trigger: function( type, data ) {
  915. jQuery.event.trigger( type, data, this );
  916. }
  917. }
  918. };
  919. jQuery.init();
  920. jQuery.fn.extend({
  921. // We're overriding the old toggle function, so
  922. // remember it for later
  923. _toggle: jQuery.fn.toggle,
  924. toggle: function(a,b) {
  925. // If two functions are passed in, we're
  926. // toggling on a click
  927. return a && b && a.constructor == Function && b.constructor == Function ? this.click(function(e){
  928. // Figure out which function to execute
  929. this.last = this.last == a ? b : a;
  930. // Make sure that clicks stop
  931. e.preventDefault();
  932. // and execute the function
  933. return this.last.apply( this, [e] ) || false;
  934. }) :
  935. // Otherwise, execute the old toggle function
  936. this._toggle.apply( this, arguments );
  937. },
  938. hover: function(f,g) {
  939. // A private function for haandling mouse 'hovering'
  940. function handleHover(e) {
  941. // Check if mouse(over|out) are still within the same parent element
  942. var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
  943. // Traverse up the tree
  944. while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
  945. // If we actually just moused on to a sub-element, ignore it
  946. if ( p == this ) return false;
  947. // Execute the right function
  948. return (e.type == "mouseover" ? f : g).apply(this, [e]);
  949. }
  950. // Bind the function to the two event listeners
  951. return this.mouseover(handleHover).mouseout(handleHover);
  952. },
  953. ready: function(f) {
  954. // If the DOM is already ready
  955. if ( jQuery.isReady )
  956. // Execute the function immediately
  957. f.apply( document );
  958. // Otherwise, remember the function for later
  959. else {
  960. // Add the function to the wait list
  961. jQuery.readyList.push( f );
  962. }
  963. return this;
  964. }
  965. });
  966. jQuery.extend({
  967. /*
  968.  * All the code that makes DOM Ready work nicely.
  969.  */
  970. isReady: false,
  971. readyList: [],
  972. // Handle when the DOM is ready
  973. ready: function() {
  974. // Make sure that the DOM is not already loaded
  975. if ( !jQuery.isReady ) {
  976. // Remember that the DOM is ready
  977. jQuery.isReady = true;
  978. // If there are functions bound, to execute
  979. if ( jQuery.readyList ) {
  980. // Execute all of them
  981. for ( var i = 0; i < jQuery.readyList.length; i++ )
  982. jQuery.readyList[i].apply( document );
  983. // Reset the list of functions
  984. jQuery.readyList = null;
  985. }
  986. // Remove event lisenter to avoid memory leak
  987. if ( jQuery.browser.mozilla || jQuery.browser.opera )
  988. document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
  989. }
  990. }
  991. });
  992. new function(){
  993. var e = ("blur,focus,load,resize,scroll,unload,click,dblclick," +
  994. "mousedown,mouseup,mousemove,mouseover,mouseout,change,reset,select," + 
  995. "submit,keydown,keypress,keyup,error").split(",");
  996. // Go through all the event names, but make sure that
  997. // it is enclosed properly
  998. for ( var i = 0; i < e.length; i++ ) new function(){
  999. var o = e[i];
  1000. // Handle event binding
  1001. jQuery.fn[o] = function(f){
  1002. return f ? this.bind(o, f) : this.trigger(o);
  1003. };
  1004. // Handle event unbinding
  1005. jQuery.fn["un"+o] = function(f){ return this.unbind(o, f); };
  1006. // Finally, handle events that only fire once
  1007. jQuery.fn["one"+o] = function(f){
  1008. // Attach the event listener
  1009. return this.each(function(){
  1010. var count = 0;
  1011. // Add the event
  1012. jQuery.event.add( this, o, function(e){
  1013. // If this function has already been executed, stop
  1014. if ( count++ ) return;
  1015. // And execute the bound function
  1016. return f.apply(this, [e]);
  1017. });
  1018. });
  1019. };
  1020. };
  1021. // If Mozilla is used
  1022. if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
  1023. // Use the handy event callback
  1024. document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
  1025. // If IE is used, use the excellent hack by Matthias Miller
  1026. // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
  1027. } else if ( jQuery.browser.msie ) {
  1028. // Only works if you document.write() it
  1029. document.write("<scr" + "ipt id=__ie_init defer=true " + 
  1030. "src=//:></script>");
  1031. // Use the defer script hack
  1032. var script = document.getElementById("__ie_init");
  1033. script.onreadystatechange = function() {
  1034. if ( this.readyState != "complete" ) return;
  1035. this.parentNode.removeChild( this );
  1036. jQuery.ready();
  1037. };
  1038. // Clear from memory
  1039. script = null;
  1040. // If Safari  is used
  1041. } else if ( jQuery.browser.safari ) {
  1042. // Continually check to see if the document.readyState is valid
  1043. jQuery.safariTimer = setInterval(function(){
  1044. // loaded and complete are both valid states
  1045. if ( document.readyState == "loaded" || 
  1046. document.readyState == "complete" ) {
  1047. // If either one are found, remove the timer
  1048. clearInterval( jQuery.safariTimer );
  1049. jQuery.safariTimer = null;
  1050. // and execute any waiting functions
  1051. jQuery.ready();
  1052. }
  1053. }, 10);
  1054. // A fallback to window.onload, that will always work
  1055. jQuery.event.add( window, "load", jQuery.ready );
  1056. };
  1057. // Clean up after IE to avoid memory leaks
  1058. if (jQuery.browser.msie) jQuery(window).unload(function() {
  1059. var event = jQuery.event, global = event.global;
  1060. for (var type in global) {
  1061.   var els = global[type], i = els.length;
  1062. if (i>0) do if (type != 'unload') event.remove(els[i-1], type); while (--i);
  1063. }
  1064. });
  1065. jQuery.fn.extend({
  1066. // overwrite the old show method
  1067. _show: jQuery.fn.show,
  1068. show: function(speed,callback){
  1069. return speed ? this.animate({
  1070. height: "show", width: "show", opacity: "show"
  1071. }, speed, callback) : this._show();
  1072. },
  1073. // Overwrite the old hide method
  1074. _hide: jQuery.fn.hide,
  1075. hide: function(speed,callback){
  1076. return speed ? this.animate({
  1077. height: "hide", width: "hide", opacity: "hide"
  1078. }, speed, callback) : this._hide();
  1079. },
  1080. slideDown: function(speed,callback){
  1081. return this.animate({height: "show"}, speed, callback);
  1082. },
  1083. slideUp: function(speed,callback){
  1084. return this.animate({height: "hide"}, speed, callback);
  1085. },
  1086. slideToggle: function(speed,callback){
  1087. return this.each(function(){
  1088. var state = jQuery(this).is(":hidden") ? "show" : "hide";
  1089. jQuery(this).animate({height: state}, speed, callback);
  1090. });
  1091. },
  1092. fadeIn: function(speed,callback){
  1093. return this.animate({opacity: "show"}, speed, callback);
  1094. },
  1095. fadeOut: function(speed,callback){
  1096. return this.animate({opacity: "hide"}, speed, callback);
  1097. },
  1098. fadeTo: function(speed,to,callback){
  1099. return this.animate({opacity: to}, speed, callback);
  1100. },
  1101. animate: function(prop,speed,callback) {
  1102. return this.queue(function(){
  1103. this.curAnim = prop;
  1104. for ( var p in prop ) {
  1105. var e = new jQuery.fx( this, jQuery.speed(speed,callback), p );
  1106. if ( prop[p].constructor == Number )
  1107. e.custom( e.cur(), prop[p] );
  1108. else
  1109. e[ prop[p] ]( prop );
  1110. }
  1111. });
  1112. },
  1113. queue: function(type,fn){
  1114. if ( !fn ) {
  1115. fn = type;
  1116. type = "fx";
  1117. }
  1118. return this.each(function(){
  1119. if ( !this.queue )
  1120. this.queue = {};
  1121. if ( !this.queue[type] )
  1122. this.queue[type] = [];
  1123. this.queue[type].push( fn );
  1124. if ( this.queue[type].length == 1 )
  1125. fn.apply(this);
  1126. });
  1127. }
  1128. });
  1129. jQuery.extend({
  1130. setAuto: function(e,p) {
  1131. if ( e.notAuto ) return;
  1132. if ( p == "height" && e.scrollHeight != parseInt(jQuery.curCSS(e,p)) ) return;
  1133. if ( p == "width" && e.scrollWidth != parseInt(jQuery.curCSS(e,p)) ) return;
  1134. // Remember the original height
  1135. var a = e.style[p];
  1136. // Figure out the size of the height right now
  1137. var o = jQuery.curCSS(e,p,1);
  1138. if ( p == "height" && e.scrollHeight != o ||
  1139. p == "width" && e.scrollWidth != o ) return;
  1140. // Set the height to auto
  1141. e.style[p] = e.currentStyle ? "" : "auto";
  1142. // See what the size of "auto" is
  1143. var n = jQuery.curCSS(e,p,1);
  1144. // Revert back to the original size
  1145. if ( o != n && n != "auto" ) {
  1146. e.style[p] = a;
  1147. e.notAuto = true;
  1148. }
  1149. },
  1150. speed: function(s,o) {
  1151. o = o || {};
  1152. if ( o.constructor == Function )
  1153. o = { complete: o };
  1154. var ss = { slow: 600, fast: 200 };
  1155. o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
  1156. // Queueing
  1157. o.oldComplete = o.complete;
  1158. o.complete = function(){
  1159. jQuery.dequeue(this, "fx");
  1160. if ( o.oldComplete && o.oldComplete.constructor == Function )
  1161. o.oldComplete.apply( this );
  1162. };
  1163. return o;
  1164. },
  1165. queue: {},
  1166. dequeue: function(elem,type){
  1167. type = type || "fx";
  1168. if ( elem.queue && elem.queue[type] ) {
  1169. // Remove self
  1170. elem.queue[type].shift();
  1171. // Get next function
  1172. var f = elem.queue[type][0];
  1173. if ( f ) f.apply( elem );
  1174. }
  1175. },
  1176. /*
  1177.  * I originally wrote fx() as a clone of moo.fx and in the process
  1178.  * of making it small in size the code became illegible to sane
  1179.  * people. You've been warned.
  1180.  */
  1181. fx: function( elem, options, prop ){
  1182. var z = this;
  1183. // The users options
  1184. z.o = {
  1185. duration: options.duration || 400,
  1186. complete: options.complete,
  1187. step: options.step
  1188. };
  1189. // The element
  1190. z.el = elem;
  1191. // The styles
  1192. var y = z.el.style;
  1193. // Simple function for setting a style value
  1194. z.a = function(){
  1195. if ( options.step )
  1196. options.step.apply( elem, [ z.now ] );
  1197.  
  1198. if ( prop == "opacity" )
  1199. jQuery.attr(y, "opacity", z.now); // Let attr handle opacity
  1200. else if ( parseInt(z.now) ) // My hate for IE will never die
  1201. y[prop] = parseInt(z.now) + "px";
  1202. y.display = "block";
  1203. };
  1204. // Figure out the maximum number to run to
  1205. z.max = function(){
  1206. return parseFloat( jQuery.css(z.el,prop) );
  1207. };
  1208. // Get the current size
  1209. z.cur = function(){
  1210. var r = parseFloat( jQuery.curCSS(z.el, prop) );
  1211. return r && r > -10000 ? r : z.max();
  1212. };
  1213. // Start an animation from one number to another
  1214. z.custom = function(from,to){
  1215. z.startTime = (new Date()).getTime();
  1216. z.now = from;
  1217. z.a();
  1218. z.timer = setInterval(function(){
  1219. z.step(from, to);
  1220. }, 13);
  1221. };
  1222. // Simple 'show' function
  1223. z.show = function( p ){
  1224. if ( !z.el.orig ) z.el.orig = {};
  1225. // Remember where we started, so that we can go back to it later
  1226. z.el.orig[prop] = this.cur();
  1227. // Begin the animation
  1228. if (prop == "opacity")
  1229. z.custom(z.el.orig[prop], 1);
  1230. else
  1231. z.custom(0, z.el.orig[prop]);
  1232. // Stupid IE, look what you made me do
  1233. if ( prop != "opacity" )
  1234. y[prop] = "1px";
  1235. };
  1236. // Simple 'hide' function
  1237. z.hide = function(){
  1238. if ( !z.el.orig ) z.el.orig = {};
  1239. // Remember where we started, so that we can go back to it later
  1240. z.el.orig[prop] = this.cur();
  1241. z.o.hide = true;
  1242. // Begin the animation
  1243. z.custom(z.el.orig[prop], 0);
  1244. };
  1245. // Remember  the overflow of the element
  1246. if ( !z.el.oldOverlay )
  1247. z.el.oldOverflow = jQuery.css( z.el, "overflow" );
  1248. // Make sure that nothing sneaks out
  1249. y.overflow = "hidden";
  1250. // Each step of an animation
  1251. z.step = function(firstNum, lastNum){
  1252. var t = (new Date()).getTime();
  1253. if (t > z.o.duration + z.startTime) {
  1254. // Stop the timer
  1255. clearInterval(z.timer);
  1256. z.timer = null;
  1257. z.now = lastNum;
  1258. z.a();
  1259. z.el.curAnim[ prop ] = true;
  1260. var done = true;
  1261. for ( var i in z.el.curAnim )
  1262. if ( z.el.curAnim[i] !== true )
  1263. done = false;
  1264. if ( done ) {
  1265. // Reset the overflow
  1266. y.overflow = z.el.oldOverflow;
  1267. // Hide the element if the "hide" operation was done
  1268. if ( z.o.hide ) 
  1269. y.display = 'none';
  1270. // Reset the property, if the item has been hidden
  1271. if ( z.o.hide ) {
  1272. for ( var p in z.el.curAnim ) {
  1273. if (p == "opacity" && jQuery.browser.msie)
  1274. jQuery.attr(y, p, z.el.orig[p]);
  1275. else
  1276. y[ p ] = z.el.orig[p] + "px";
  1277. // set its height and/or width to auto
  1278. if ( p == 'height' || p == 'width' )
  1279. jQuery.setAuto( z.el, p );
  1280. }
  1281. }
  1282. }
  1283. // If a callback was provided, execute it
  1284. if( done && z.o.complete && z.o.complete.constructor == Function )
  1285. // Execute the complete function
  1286. z.o.complete.apply( z.el );
  1287. } else {
  1288. // Figure out where in the animation we are and set the number
  1289. var p = (t - this.startTime) / z.o.duration;
  1290. z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
  1291. // Perform the next step of the animation
  1292. z.a();
  1293. }
  1294. };
  1295. }
  1296. });
  1297. jQuery.fn.extend({
  1298. loadIfModified: function( url, params, callback ) {
  1299. this.load( url, params, callback, 1 );
  1300. },
  1301. load: function( url, params, callback, ifModified ) {
  1302. if ( url.constructor == Function )
  1303. return this.bind("load", url);
  1304. callback = callback || function(){};
  1305. // Default to a GET request
  1306. var type = "GET";
  1307. // If the second parameter was provided
  1308. if ( params ) {
  1309. // If it's a function
  1310. if ( params.constructor == Function ) {
  1311. // We assume that it's the callback
  1312. callback = params;
  1313. params = null;
  1314. // Otherwise, build a param string
  1315. } else {
  1316. params = jQuery.param( params );
  1317. type = "POST";
  1318. }
  1319. }
  1320. var self = this;
  1321. // Request the remote document
  1322. jQuery.ajax( type, url, params,function(res, status){
  1323. if ( status == "success" || !ifModified && status == "notmodified" ) {
  1324. // Inject the HTML into all the matched elements
  1325. self.html(res.responseText).each( callback, [res.responseText, status] );
  1326. // Execute all the scripts inside of the newly-injected HTML
  1327. jQuery("script", self).each(function(){
  1328. if ( this.src )
  1329. jQuery.getScript( this.src );
  1330. else
  1331. eval.call( window, this.text || this.textContent || this.innerHTML || "" );
  1332. });
  1333. } else
  1334. callback.apply( self, [res.responseText, status] );
  1335. }, ifModified);
  1336. return this;
  1337. },
  1338. serialize: function() {
  1339. return jQuery.param( this );
  1340. }
  1341. });
  1342. // If IE is used, create a wrapper for the XMLHttpRequest object
  1343. if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" )
  1344. XMLHttpRequest = function(){
  1345. return new ActiveXObject(
  1346. navigator.userAgent.indexOf("MSIE 5") >= 0 ?
  1347. "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
  1348. );
  1349. };
  1350. // Attach a bunch of functions for handling common AJAX events
  1351.  
  1352. new function(){
  1353. var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(",");
  1354. for ( var i = 0; i < e.length; i++ ) new function(){
  1355. var o = e[i];
  1356. jQuery.fn[o] = function(f){
  1357. return this.bind(o, f);
  1358. };
  1359. };
  1360. };
  1361. jQuery.extend({
  1362. get: function( url, data, callback, type, ifModified ) {
  1363. if ( data.constructor == Function ) {
  1364. type = callback;
  1365. callback = data;
  1366. data = null;
  1367. }
  1368. // append ? + data or & + data, in case there are already params
  1369. if ( data ) url += ((url.indexOf("?") > -1) ? "&" : "?") + jQuery.param(data);
  1370. // Build and start the HTTP Request
  1371. jQuery.ajax( "GET", url, null, function(r, status) {
  1372. if ( callback ) callback( jQuery.httpData(r,type), status );
  1373. }, ifModified);
  1374. },
  1375. getIfModified: function( url, data, callback, type ) {
  1376. jQuery.get(url, data, callback, type, 1);
  1377. },
  1378. getScript: function( url, callback ) {
  1379. jQuery.get(url, callback, "script");
  1380. },
  1381. getJSON: function( url, data, callback ) {
  1382. if(callback)
  1383. jQuery.get(url, data, callback, "json");
  1384. else {
  1385. jQuery.get(url, data, "json");
  1386. }
  1387. },
  1388. post: function( url, data, callback, type ) {
  1389. // Build and start the HTTP Request
  1390. jQuery.ajax( "POST", url, jQuery.param(data), function(r, status) {
  1391. if ( callback ) callback( jQuery.httpData(r,type), status );
  1392. });
  1393. },
  1394. // timeout (ms)
  1395. timeout: 0,
  1396. ajaxTimeout: function(timeout) {
  1397. jQuery.timeout = timeout;
  1398. },
  1399. // Last-Modified header cache for next request
  1400. lastModified: {},
  1401. ajax: function( type, url, data, ret, ifModified ) {
  1402. // If only a single argument was passed in,
  1403. // assume that it is a object of key/value pairs
  1404. if ( !url ) {
  1405. ret = type.complete;
  1406. var success = type.success;
  1407. var error = type.error;
  1408. var dataType = type.dataType;
  1409. var global = typeof type.global == "boolean" ? type.global : true;
  1410. var timeout = typeof type.timeout == "number" ? type.timeout : jQuery.timeout;
  1411. var ifModified = type.ifModified || false;
  1412. data = type.data;
  1413. url = type.url;
  1414. type = type.type;
  1415. }
  1416. // Watch for a new set of requests
  1417. if ( global && ! jQuery.active++ )
  1418. jQuery.event.trigger( "ajaxStart" );
  1419. var requestDone = false;
  1420. // Create the request object
  1421. var xml = new XMLHttpRequest();
  1422. // Open the socket
  1423. xml.open(type || "GET", url, true);
  1424. // Set the correct header, if data is being sent
  1425. if ( data )
  1426. xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  1427. // Set the If-Modified-Since header, if ifModified mode.
  1428. if ( ifModified )
  1429. xml.setRequestHeader("If-Modified-Since",
  1430. jQuery.lastModified[url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
  1431. // Set header so the called script knows that it's an XMLHttpRequest
  1432. xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  1433. // Make sure the browser sends the right content length
  1434. if ( xml.overrideMimeType )
  1435. xml.setRequestHeader("Connection", "close");
  1436. // Wait for a response to come back
  1437. var onreadystatechange = function(istimeout){
  1438. // The transfer is complete and the data is available, or the request timed out
  1439. if ( xml && (xml.readyState == 4 || istimeout == "timeout") ) {
  1440. requestDone = true;
  1441. var status = jQuery.httpSuccess( xml ) && istimeout != "timeout" ?
  1442. ifModified && jQuery.httpNotModified( xml, url ) ? "notmodified" : "success" : "error";
  1443. // Make sure that the request was successful or notmodified
  1444. if ( status != "error" ) {
  1445. // Cache Last-Modified header, if ifModified mode.
  1446. var modRes;
  1447. try {
  1448. modRes = xml.getResponseHeader("Last-Modified");
  1449. } catch(e) {} // swallow exception thrown by FF if header is not available
  1450. if ( ifModified && modRes )
  1451. jQuery.lastModified[url] = modRes;
  1452. // If a local callback was specified, fire it
  1453. if ( success )
  1454. success( jQuery.httpData( xml, dataType ), status );
  1455. // Fire the global callback
  1456. if( global )
  1457. jQuery.event.trigger( "ajaxSuccess" );
  1458. // Otherwise, the request was not successful
  1459. } else {
  1460. // If a local callback was specified, fire it
  1461. if ( error ) error( xml, status );
  1462. // Fire the global callback
  1463. if( global )
  1464. jQuery.event.trigger( "ajaxError" );
  1465. }
  1466. // The request was completed
  1467. if( global )
  1468. jQuery.event.trigger( "ajaxComplete" );
  1469. // Handle the global AJAX counter
  1470. if ( global && ! --jQuery.active )
  1471. jQuery.event.trigger( "ajaxStop" );
  1472. // Process result
  1473. if ( ret ) ret(xml, status);
  1474. // Stop memory leaks
  1475. xml.onreadystatechange = function(){};
  1476. xml = null;
  1477. }
  1478. };
  1479. xml.onreadystatechange = onreadystatechange;
  1480. // Timeout checker
  1481. if(timeout > 0)
  1482. setTimeout(function(){
  1483. // Check to see if the request is still happening
  1484. if (xml) {
  1485. // Cancel the request
  1486. xml.abort();
  1487. if ( !requestDone ) onreadystatechange( "timeout" );
  1488. // Clear from memory
  1489. xml = null;
  1490. }
  1491. }, timeout);
  1492. // Send the data
  1493. xml.send(data);
  1494. },
  1495. // Counter for holding the number of active queries
  1496. active: 0,
  1497. // Determines if an XMLHttpRequest was successful or not
  1498. httpSuccess: function(r) {
  1499. try {
  1500. return !r.status && location.protocol == "file:" ||
  1501. ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
  1502. jQuery.browser.safari && r.status == undefined;
  1503. } catch(e){}
  1504. return false;
  1505. },
  1506. // Determines if an XMLHttpRequest returns NotModified
  1507. httpNotModified: function(xml, url) {
  1508. try {
  1509. var xmlRes = xml.getResponseHeader("Last-Modified");
  1510. // Firefox always returns 200. check Last-Modified date
  1511. return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
  1512. jQuery.browser.safari && xml.status == undefined;
  1513. } catch(e){}
  1514. return false;
  1515. },
  1516. /* Get the data out of an XMLHttpRequest.
  1517.  * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
  1518.  * otherwise return plain text.
  1519.  * (String) data - The type of data that you're expecting back,
  1520.  * (e.g. "xml", "html", "script")
  1521.  */
  1522. httpData: function(r,type) {
  1523. var ct = r.getResponseHeader("content-type");
  1524. var data = !type && ct && ct.indexOf("xml") >= 0;
  1525. data = type == "xml" || data ? r.responseXML : r.responseText;
  1526. // If the type is "script", eval it
  1527. if ( type == "script" ) eval.call( window, data );
  1528. // Get the JavaScript object, if JSON is used.
  1529. if ( type == "json" ) eval( "data = " + data );
  1530. return data;
  1531. },
  1532. // Serialize an array of form elements or a set of
  1533. // key/values into a query string
  1534. param: function(a) {
  1535. var s = [];
  1536. // If an array was passed in, assume that it is an array
  1537. // of form elements
  1538. if ( a.constructor == Array || a.jquery ) {
  1539. // Serialize the form elements
  1540. for ( var i = 0; i < a.length; i++ )
  1541. s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
  1542. // Otherwise, assume that it's an object of key/value pairs
  1543. } else {
  1544. // Serialize the key/values
  1545. for ( var j in a )
  1546. s.push( j + "=" + encodeURIComponent( a[j] ) );
  1547. }
  1548. // Return the resulting serialization
  1549. return s.join("&");
  1550. }
  1551. });
  1552. } // close: if(typeof window.jQuery == "undefined") {