ramaze 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. data/Rakefile +1 -1
  2. data/doc/AUTHORS +2 -0
  3. data/doc/CHANGELOG +173 -0
  4. data/doc/changes.txt +4184 -0
  5. data/doc/changes.xml +4186 -0
  6. data/doc/meta/announcement.txt +22 -25
  7. data/doc/meta/internals.txt +146 -9
  8. data/examples/blog/template/index.xhtml +5 -2
  9. data/examples/fcgi.rb +13 -0
  10. data/examples/wiktacular/main.rb +8 -0
  11. data/examples/wiktacular/mkd/link/2007-07-20_19-45-51.mkd +1 -0
  12. data/examples/wiktacular/mkd/link/current.mkd +1 -0
  13. data/examples/wiktacular/mkd/main/2007-07-20_16-31-33.mkd +1 -0
  14. data/examples/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -0
  15. data/examples/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +2 -0
  16. data/examples/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +2 -0
  17. data/examples/wiktacular/mkd/main/current.mkd +2 -0
  18. data/examples/wiktacular/mkd/markdown/current.mkd +3 -0
  19. data/examples/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +2 -0
  20. data/examples/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +3 -0
  21. data/examples/wiktacular/mkd/testing/2007-07-21_18-46-01.mkd +11 -0
  22. data/examples/wiktacular/mkd/testing/2007-07-21_18-46-32.mkd +13 -0
  23. data/examples/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +17 -0
  24. data/examples/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +17 -0
  25. data/examples/wiktacular/mkd/testing/current.mkd +17 -0
  26. data/examples/wiktacular/public/favicon.ico +0 -0
  27. data/examples/wiktacular/public/screen.css +72 -0
  28. data/examples/wiktacular/src/controller.rb +44 -0
  29. data/examples/wiktacular/src/model.rb +92 -0
  30. data/examples/wiktacular/src/page.rb +66 -0
  31. data/examples/wiktacular/template/edit.xhtml +7 -0
  32. data/examples/wiktacular/template/index.xhtml +11 -0
  33. data/examples/wiktacular/template/new.xhtml +7 -0
  34. data/lib/proto/main.rb +2 -0
  35. data/lib/proto/public/error.zmr +3 -0
  36. data/lib/proto/public/js/jquery.js +1755 -1334
  37. data/lib/proto/template/index.xhtml +2 -2
  38. data/lib/ramaze.rb +8 -3
  39. data/lib/ramaze/action/render.rb +11 -0
  40. data/lib/ramaze/adapter/base.rb +11 -7
  41. data/lib/ramaze/cache.rb +25 -10
  42. data/lib/ramaze/cache/memcached.rb +16 -1
  43. data/lib/ramaze/cache/yaml_store.rb +10 -0
  44. data/lib/ramaze/controller.rb +12 -2
  45. data/lib/ramaze/controller/error.rb +9 -3
  46. data/lib/ramaze/controller/resolve.rb +20 -18
  47. data/lib/ramaze/dispatcher.rb +13 -4
  48. data/lib/ramaze/dispatcher/action.rb +7 -3
  49. data/lib/ramaze/dispatcher/error.rb +24 -2
  50. data/lib/ramaze/dispatcher/file.rb +12 -6
  51. data/lib/ramaze/global.rb +0 -3
  52. data/lib/ramaze/global/dsl.rb +9 -0
  53. data/lib/ramaze/global/globalstruct.rb +7 -1
  54. data/lib/ramaze/helper/aspect.rb +4 -2
  55. data/lib/ramaze/helper/cgi.rb +2 -2
  56. data/lib/ramaze/helper/file.rb +3 -0
  57. data/lib/ramaze/helper/link.rb +20 -0
  58. data/lib/ramaze/helper/markaby.rb +3 -0
  59. data/lib/ramaze/helper/pager.rb +10 -17
  60. data/lib/ramaze/helper/partial.rb +9 -3
  61. data/lib/ramaze/inform/analogger.rb +14 -0
  62. data/lib/ramaze/inform/growl.rb +7 -0
  63. data/lib/ramaze/inform/hub.rb +9 -0
  64. data/lib/ramaze/inform/informer.rb +9 -3
  65. data/lib/ramaze/inform/informing.rb +9 -3
  66. data/lib/ramaze/inform/knotify.rb +5 -1
  67. data/lib/ramaze/inform/syslog.rb +3 -0
  68. data/lib/ramaze/inform/xosd.rb +12 -0
  69. data/lib/ramaze/template.rb +3 -0
  70. data/lib/ramaze/template/amrita2.rb +2 -0
  71. data/lib/ramaze/template/erubis.rb +1 -0
  72. data/lib/ramaze/template/ezamar.rb +1 -0
  73. data/lib/ramaze/template/ezamar/element.rb +17 -11
  74. data/lib/ramaze/template/ezamar/engine.rb +5 -0
  75. data/lib/ramaze/template/ezamar/render_partial.rb +4 -2
  76. data/lib/ramaze/template/haml.rb +4 -0
  77. data/lib/ramaze/template/liquid.rb +4 -0
  78. data/lib/ramaze/template/markaby.rb +4 -0
  79. data/lib/ramaze/template/remarkably.rb +4 -0
  80. data/lib/ramaze/tool.rb +10 -0
  81. data/lib/ramaze/tool/localize.rb +1 -1
  82. data/lib/ramaze/trinity/session.rb +8 -1
  83. data/lib/ramaze/version.rb +1 -1
  84. data/rake_tasks/maintaince.rake +2 -2
  85. data/spec/ramaze/action/basics.rb +1 -1
  86. data/spec/ramaze/cache.rb +11 -0
  87. data/spec/ramaze/controller.rb +0 -14
  88. data/spec/ramaze/dispatcher/file.rb +5 -5
  89. data/spec/ramaze/dispatcher/public/favicon.ico +0 -0
  90. data/spec/ramaze/dispatcher/public/test_download.css +141 -0
  91. data/spec/ramaze/error.rb +21 -7
  92. data/spec/ramaze/helper/link.rb +15 -0
  93. data/spec/ramaze/helper/pager.rb +26 -3
  94. data/spec/ramaze/helper/partial.rb +2 -2
  95. metadata +43 -4
  96. data/doc/COPYING.ja +0 -51
@@ -0,0 +1,44 @@
1
+ class MainController < Ramaze::Controller
2
+ def index handle = "main"
3
+ @handle = handle
4
+ @entry = WikiEntry.new(handle)
5
+ if @entry.exists?
6
+ @text = EntryView.render(@entry.content)
7
+ @history = @entry.history.map{|f|
8
+ DateTime.strptime(File.basename(f, ".mkd"),
9
+ "%Y-%m-%d_%H-%M-%S")
10
+ }.join("<br />\n")
11
+ else
12
+ @text = "No Entry"
13
+ end
14
+ end
15
+
16
+ def edit handle
17
+ @handle = handle
18
+ @entry = WikiEntry[handle]
19
+ @text = @entry.content
20
+ end
21
+
22
+ def revert handle
23
+ WikiEntry[handle].revert
24
+ redirect Rs(handle)
25
+ end
26
+
27
+ def unrevert handle
28
+ WikiEntry[handle].unrevert
29
+ redirect Rs(handle)
30
+ end
31
+
32
+ def delete handle
33
+ WikiEntry[handle].delete
34
+ redirect_referer
35
+ end
36
+
37
+ def save
38
+ redirect_referer unless request.post?
39
+ handle = request['handle']
40
+ entry = WikiEntry[handle]
41
+ entry.save(request['text'])
42
+ redirect Rs(:index, handle)
43
+ end
44
+ end
@@ -0,0 +1,92 @@
1
+ require 'fileutils'
2
+ require 'cgi'
3
+
4
+ class WikiEntry
5
+ class << self
6
+ def [](name)
7
+ new(name)
8
+ end
9
+ end
10
+
11
+ attr_reader :history, :current, :name
12
+
13
+ def initialize(name)
14
+ # avoid tampering with the path
15
+ @name = File.basename(File.expand_path(name))
16
+ update
17
+ end
18
+
19
+ def update
20
+ @current = "#{base}/current.mkd"
21
+ @history = Dir["#{base}/*_*.mkd"]
22
+ end
23
+
24
+ def save newtext
25
+ FileUtils.mkdir_p(base)
26
+
27
+ if content != newtext
28
+ history_name = "#{base}/#{timestamp}.mkd"
29
+ FileUtils.mv(@current, history_name) if exists?
30
+ File.open(@current, "w+"){|fp| fp.print(newtext) }
31
+ end
32
+ end
33
+
34
+ def rename to
35
+ FileUtils.mv(base, "mkd/#{to}")
36
+ end
37
+
38
+ def delete
39
+ FileUtils.rm_rf(base)
40
+ end
41
+
42
+ def revert
43
+ return if not exists? or @history.empty?
44
+ FileUtils.mv(@current, @current + ".bak")
45
+ FileUtils.mv(@history.last, @current) unless @history.empty?
46
+ update
47
+ end
48
+
49
+ def unrevert
50
+ bakfile = @current + '.bak'
51
+ return unless File.exists?(bakfile)
52
+ FileUtils.mv(bakfile, @current)
53
+ update
54
+ end
55
+
56
+ def exists?
57
+ File.exists?(@current)
58
+ end
59
+
60
+ def base
61
+ "mkd/#@name"
62
+ end
63
+
64
+ def content
65
+ CGI.unescapeHTML(File.read(@current)) if exists?
66
+ end
67
+
68
+ def timestamp
69
+ Time.now.strftime("%Y-%m-%d_%H-%M-%S")
70
+ end
71
+
72
+ def escape_path(path)
73
+ File.basename(File.expand_path(path))
74
+ end
75
+ end
76
+
77
+ class EntryView
78
+ class << self
79
+ def render content
80
+ mkd2html(content || "No Entry")
81
+ end
82
+
83
+ def mkd2html text
84
+ html = BlueCloth.new(text).to_html
85
+ html.gsub!(/\[\[(.*?)\]\]/) do |m|
86
+ exists = WikiEntry[$1] ? 'exists' : 'nonexists'
87
+ %{<a href="/#{CGI.escape($1)}" class="#{exists}">#{$1}</a>}
88
+ end
89
+ html
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,66 @@
1
+ class Page < Ezamar::Element
2
+ def head
3
+ %{
4
+ <html>
5
+ <head>
6
+ <title>Wiktacular</title>
7
+ <link rel="stylesheet" type="text/css" media="screen" href="/screen.css" />
8
+ </head>
9
+ <body>
10
+ }
11
+ end
12
+
13
+ def menu
14
+ %{
15
+ <div id="menu">
16
+ <a href="/main">Home</a>
17
+ <a href="/new">New Entry</a>
18
+ </div>
19
+ }
20
+ end
21
+
22
+ def navigation
23
+ nodes = Dir['mkd/*'].map{|f|
24
+ name = File.basename(f)
25
+ %[<a href="/#{name}">#{name}</a>]
26
+ }.join("\n")
27
+ %{
28
+ <div id="navigation">
29
+ <div id="nodes">
30
+ #{nodes}
31
+ </div>
32
+ </div>
33
+ }
34
+ end
35
+
36
+ def main
37
+ %{
38
+ <div id="manipulate">
39
+ <a href="/edit/\#@handle">Edit</a>
40
+ <a href="/delete/\#@handle">Delete</a>
41
+ <a href="/revert/\#@handle">Revert</a>
42
+ <a href="/unrevert/\#@handle">Unrevert</a>
43
+ </div>
44
+ <div id="content">
45
+ #{content}
46
+ </div>
47
+ }
48
+ end
49
+
50
+ def render
51
+ head +
52
+ menu +
53
+ navigation +
54
+ main +
55
+ footer
56
+ end
57
+
58
+
59
+ def footer
60
+ %{
61
+ <div id="copyright">Wiktacular is powered by <a href="http://ramaze.rubyforge.org/">Ramaze</a></div>
62
+ </body>
63
+ </html>
64
+ }
65
+ end
66
+ end
@@ -0,0 +1,7 @@
1
+ <Page>
2
+ <form method="POST" action="/save" id="edit_entry">
3
+ <input type="text" name="handle" value="#@handle" />
4
+ <textarea name="text">#@text</textarea>
5
+ <input type="submit" />
6
+ </form>
7
+ </Page>
@@ -0,0 +1,11 @@
1
+ <Page>
2
+ <div id="text">
3
+ #@text
4
+ </div>
5
+ <?r if @history ?>
6
+ <div id="history">
7
+ History of this entry:<br />
8
+ #@history
9
+ </div>
10
+ <?r end ?>
11
+ </Page>
@@ -0,0 +1,7 @@
1
+ <Page>
2
+ <form method="POST" action="/save" id="new_entry">
3
+ <input type="text" name="handle" />
4
+ <textarea name="text"></textarea>
5
+ <input type="submit" />
6
+ </form>
7
+ </Page>
data/lib/proto/main.rb CHANGED
@@ -8,3 +8,5 @@ include Ramaze
8
8
  require 'src/controller/main'
9
9
  require 'src/element/page'
10
10
  require 'src/model'
11
+
12
+ Ramaze.start
@@ -7,6 +7,9 @@
7
7
  <body>
8
8
  <h1>#{@title}</h1>
9
9
 
10
+ <p>The backtrace gives filenames and line numbers for all parts of the call stack.<br />
11
+ Click on any of them to view the surrounding source code.</p>
12
+
10
13
  <table class="main">
11
14
  <tr class="head">
12
15
  <td>File</td><td>Line</td><td>Method</td>
@@ -1,91 +1,92 @@
1
- /* prevent execution of jQuery if included more then once */
1
+ // prevent execution of jQuery if included more than once
2
2
  if(typeof window.jQuery == "undefined") {
3
3
  /*
4
- * jQuery 1.0.2 - New Wave Javascript
4
+ * jQuery 1.1.3.1 - New Wave Javascript
5
5
  *
6
- * Copyright (c) 2006 John Resig (jquery.com)
6
+ * Copyright (c) 2007 John Resig (jquery.com)
7
7
  * Dual licensed under the MIT (MIT-LICENSE.txt)
8
8
  * and GPL (GPL-LICENSE.txt) licenses.
9
9
  *
10
- * $Date: 2006-10-09 20:23:18 -0400 (Mon, 09 Oct 2006) $
11
- * $Rev: 413 $
10
+ * $Date: 2007-07-05 00:43:24 -0400 (Thu, 05 Jul 2007) $
11
+ * $Rev: 2243 $
12
12
  */
13
13
 
14
14
  // Global undefined variable
15
15
  window.undefined = window.undefined;
16
- jQuery = function(a,c) {
17
-
18
- // Shortcut for document ready (because $(document).each() is silly)
19
- if ( a && typeof a == "function" && jQuery.fn.ready )
20
- return jQuery(document).ready(a);
21
-
22
- // Make sure that a selection was provided
23
- a = a || jQuery.context || document;
24
-
25
- // Watch for when a jQuery object is passed as the selector
26
- if ( a.jquery )
27
- return jQuery( jQuery.merge( a, [] ) );
28
-
29
- // Watch for when a jQuery object is passed at the context
30
- if ( c && c.jquery )
31
- return jQuery( c ).find(a);
32
-
16
+ var jQuery = function(a,c) {
33
17
  // If the context is global, return a new object
34
- if ( window == this )
18
+ if ( window == this || !this.init )
35
19
  return new jQuery(a,c);
36
-
37
- // Handle HTML strings
38
- var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
39
- if ( m ) a = jQuery.clean( [ m[1] ] );
40
-
41
- // Watch for when an array is passed in
42
- this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
43
- // Assume that it is an array of DOM Elements
44
- jQuery.merge( a, [] ) :
45
-
46
- // Find the matching elements and save them for later
47
- jQuery.find( a, c ) );
48
-
49
- // See if an extra function was provided
50
- var fn = arguments[ arguments.length - 1 ];
51
-
52
- // If so, execute it in context
53
- if ( fn && typeof fn == "function" )
54
- this.each(fn);
20
+
21
+ return this.init(a,c);
55
22
  };
56
23
 
57
24
  // Map over the $ in case of overwrite
58
25
  if ( typeof $ != "undefined" )
59
26
  jQuery._$ = $;
60
-
27
+
61
28
  // Map the jQuery namespace to the '$' one
62
29
  var $ = jQuery;
63
30
 
64
31
  jQuery.fn = jQuery.prototype = {
65
- jquery: "1.0.2",
32
+ init: function(a,c) {
33
+ // Make sure that a selection was provided
34
+ a = a || document;
35
+
36
+ // HANDLE: $(function)
37
+ // Shortcut for document ready
38
+ if ( jQuery.isFunction(a) )
39
+ return new jQuery(document)[ jQuery.fn.ready ? "ready" : "load" ]( a );
40
+
41
+ // Handle HTML strings
42
+ if ( typeof a == "string" ) {
43
+ // HANDLE: $(html) -> $(array)
44
+ var m = /^[^<]*(<(.|\s)+>)[^>]*$/.exec(a);
45
+ if ( m )
46
+ a = jQuery.clean( [ m[1] ] );
47
+
48
+ // HANDLE: $(expr)
49
+ else
50
+ return new jQuery( c ).find( a );
51
+ }
52
+
53
+ return this.setArray(
54
+ // HANDLE: $(array)
55
+ a.constructor == Array && a ||
56
+
57
+ // HANDLE: $(arraylike)
58
+ // Watch for when an array-like object is passed as the selector
59
+ (a.jquery || a.length && a != window && !a.nodeType && a[0] != undefined && a[0].nodeType) && jQuery.makeArray( a ) ||
60
+
61
+ // HANDLE: $(*)
62
+ [ a ] );
63
+ },
64
+ jquery: "1.1.3.1",
66
65
 
67
66
  size: function() {
68
67
  return this.length;
69
68
  },
69
+
70
+ length: 0,
70
71
 
71
72
  get: function( num ) {
72
- // Watch for when an array (of elements) is passed in
73
- if ( num && num.constructor == Array ) {
73
+ return num == undefined ?
74
74
 
75
- // Use a tricky hack to make the jQuery object
76
- // look and feel like an array
77
- this.length = 0;
78
- [].push.apply( this, num );
75
+ // Return a 'clean' array
76
+ jQuery.makeArray( this ) :
79
77
 
80
- return this;
81
- } else
82
- return num == undefined ?
83
-
84
- // Return a 'clean' array
85
- jQuery.merge( this, [] ) :
86
-
87
- // Return just the object
88
- this[num];
78
+ // Return just the object
79
+ this[num];
80
+ },
81
+ pushStack: function( a ) {
82
+ var ret = jQuery(a);
83
+ ret.prevObject = this;
84
+ return ret;
85
+ },
86
+ setArray: function( a ) {
87
+ this.length = 0;
88
+ [].push.apply( this, a );
89
+ return this;
89
90
  },
90
91
  each: function( fn, args ) {
91
92
  return jQuery.each( this, fn, args );
@@ -99,52 +100,56 @@ jQuery.fn = jQuery.prototype = {
99
100
  },
100
101
 
101
102
  attr: function( key, value, type ) {
103
+ var obj = key;
104
+
105
+ // Look for the case where we're accessing a style value
106
+ if ( key.constructor == String )
107
+ if ( value == undefined )
108
+ return this.length && jQuery[ type || "attr" ]( this[0], key ) || undefined;
109
+ else {
110
+ obj = {};
111
+ obj[ key ] = value;
112
+ }
113
+
102
114
  // Check to see if we're setting style values
103
- return key.constructor != String || value != undefined ?
104
- this.each(function(){
105
- // See if we're setting a hash of styles
106
- if ( value == undefined )
107
- // Set all the styles
108
- for ( var prop in key )
109
- jQuery.attr(
110
- type ? this.style : this,
111
- prop, key[prop]
112
- );
113
-
114
- // See if we're setting a single key/value style
115
- else
116
- jQuery.attr(
117
- type ? this.style : this,
118
- key, value
119
- );
120
- }) :
121
-
122
- // Look for the case where we're accessing a style value
123
- jQuery[ type || "attr" ]( this[0], key );
115
+ return this.each(function(index){
116
+ // Set all the styles
117
+ for ( var prop in obj )
118
+ jQuery.attr(
119
+ type ? this.style : this,
120
+ prop, jQuery.prop(this, obj[prop], type, index, prop)
121
+ );
122
+ });
124
123
  },
125
124
 
126
125
  css: function( key, value ) {
127
126
  return this.attr( key, value, "curCSS" );
128
127
  },
128
+
129
129
  text: function(e) {
130
- e = e || this;
130
+ if ( typeof e == "string" )
131
+ return this.empty().append( document.createTextNode( e ) );
132
+
131
133
  var t = "";
132
- for ( var j = 0; j < e.length; j++ ) {
133
- var r = e[j].childNodes;
134
- for ( var i = 0; i < r.length; i++ )
135
- if ( r[i].nodeType != 8 )
136
- t += r[i].nodeType != 1 ?
137
- r[i].nodeValue : jQuery.fn.text([ r[i] ]);
138
- }
134
+ jQuery.each( e || this, function(){
135
+ jQuery.each( this.childNodes, function(){
136
+ if ( this.nodeType != 8 )
137
+ t += this.nodeType != 1 ?
138
+ this.nodeValue : jQuery.fn.text([ this ]);
139
+ });
140
+ });
139
141
  return t;
140
142
  },
141
143
 
142
144
  wrap: function() {
143
145
  // The elements to wrap the target around
144
- var a = jQuery.clean(arguments);
146
+ var a, args = arguments;
145
147
 
146
148
  // Wrap each of the matched elements individually
147
149
  return this.each(function(){
150
+ if ( !a )
151
+ a = jQuery.clean(args, this.ownerDocument);
152
+
148
153
  // Clone the structure that we're using to wrap
149
154
  var b = a[0].cloneNode(true);
150
155
 
@@ -159,215 +164,216 @@ jQuery.fn = jQuery.prototype = {
159
164
  b.appendChild( this );
160
165
  });
161
166
  },
162
-
163
167
  append: function() {
164
168
  return this.domManip(arguments, true, 1, function(a){
165
169
  this.appendChild( a );
166
170
  });
167
171
  },
168
-
169
172
  prepend: function() {
170
173
  return this.domManip(arguments, true, -1, function(a){
171
174
  this.insertBefore( a, this.firstChild );
172
175
  });
173
176
  },
174
-
175
177
  before: function() {
176
178
  return this.domManip(arguments, false, 1, function(a){
177
179
  this.parentNode.insertBefore( a, this );
178
180
  });
179
181
  },
180
-
181
182
  after: function() {
182
183
  return this.domManip(arguments, false, -1, function(a){
183
184
  this.parentNode.insertBefore( a, this.nextSibling );
184
185
  });
185
186
  },
186
187
  end: function() {
187
- return this.get( this.stack.pop() );
188
+ return this.prevObject || jQuery([]);
188
189
  },
189
190
  find: function(t) {
190
- return this.pushStack( jQuery.map( this, function(a){
191
- return jQuery.find(t,a);
192
- }), arguments );
191
+ var data = jQuery.map(this, function(a){ return jQuery.find(t,a); });
192
+ return this.pushStack( /[^+>] [^+>]/.test( t ) || t.indexOf("..") > -1 ?
193
+ jQuery.unique( data ) : data );
193
194
  },
194
195
  clone: function(deep) {
195
- return this.pushStack( jQuery.map( this, function(a){
196
+ // Need to remove events on the element and its descendants
197
+ var $this = this.add(this.find("*"));
198
+ $this.each(function() {
199
+ this._$events = {};
200
+ for (var type in this.$events)
201
+ this._$events[type] = jQuery.extend({},this.$events[type]);
202
+ }).unbind();
203
+
204
+ // Do the clone
205
+ var r = this.pushStack( jQuery.map( this, function(a){
196
206
  return a.cloneNode( deep != undefined ? deep : true );
197
- }), arguments );
207
+ }) );
208
+
209
+ // Add the events back to the original and its descendants
210
+ $this.each(function() {
211
+ var events = this._$events;
212
+ for (var type in events)
213
+ for (var handler in events[type])
214
+ jQuery.event.add(this, type, events[type][handler], events[type][handler].data);
215
+ this._$events = null;
216
+ });
217
+
218
+ // Return the cloned set
219
+ return r;
198
220
  },
199
221
 
200
222
  filter: function(t) {
201
223
  return this.pushStack(
202
- t.constructor == Array &&
203
- jQuery.map(this,function(a){
204
- for ( var i = 0; i < t.length; i++ )
205
- if ( jQuery.filter(t[i],[a]).r.length )
206
- return a;
224
+ jQuery.isFunction( t ) &&
225
+ jQuery.grep(this, function(el, index){
226
+ return t.apply(el, [index])
207
227
  }) ||
208
228
 
209
- t.constructor == Boolean &&
210
- ( t ? this.get() : [] ) ||
211
-
212
- typeof t == "function" &&
213
- jQuery.grep( this, t ) ||
214
-
215
- jQuery.filter(t,this).r, arguments );
229
+ jQuery.multiFilter(t,this) );
216
230
  },
217
231
 
218
232
  not: function(t) {
219
- return this.pushStack( t.constructor == String ?
220
- jQuery.filter(t,this,false).r :
221
- jQuery.grep(this,function(a){ return a != t; }), arguments );
233
+ return this.pushStack(
234
+ t.constructor == String &&
235
+ jQuery.multiFilter(t, this, true) ||
236
+
237
+ jQuery.grep(this, function(a) {
238
+ return ( t.constructor == Array || t.jquery )
239
+ ? jQuery.inArray( a, t ) < 0
240
+ : a != t;
241
+ })
242
+ );
222
243
  },
223
244
 
224
245
  add: function(t) {
225
- return this.pushStack( jQuery.merge( this, t.constructor == String ?
226
- jQuery.find(t) : t.constructor == Array ? t : [t] ), arguments );
246
+ return this.pushStack( jQuery.merge(
247
+ this.get(),
248
+ t.constructor == String ?
249
+ jQuery(t).get() :
250
+ t.length != undefined && (!t.nodeName || t.nodeName == "FORM") ?
251
+ t : [t] )
252
+ );
227
253
  },
228
254
  is: function(expr) {
229
- return expr ? jQuery.filter(expr,this).r.length > 0 : false;
255
+ return expr ? jQuery.multiFilter(expr,this).length > 0 : false;
256
+ },
257
+
258
+ val: function( val ) {
259
+ return val == undefined ?
260
+ ( this.length ? this[0].value : null ) :
261
+ this.attr( "value", val );
262
+ },
263
+
264
+ html: function( val ) {
265
+ return val == undefined ?
266
+ ( this.length ? this[0].innerHTML : null ) :
267
+ this.empty().append( val );
230
268
  },
231
269
  domManip: function(args, table, dir, fn){
232
- var clone = this.size() > 1;
233
- var a = jQuery.clean(args);
270
+ var clone = this.length > 1, a;
234
271
 
235
272
  return this.each(function(){
273
+ if ( !a ) {
274
+ a = jQuery.clean(args, this.ownerDocument);
275
+ if ( dir < 0 )
276
+ a.reverse();
277
+ }
278
+
236
279
  var obj = this;
237
280
 
238
- if ( table && this.nodeName.toUpperCase() == "TABLE" && a[0].nodeName.toUpperCase() != "THEAD" ) {
239
- var tbody = this.getElementsByTagName("tbody");
281
+ if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") )
282
+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody"));
240
283
 
241
- if ( !tbody.length ) {
242
- obj = document.createElement("tbody");
243
- this.appendChild( obj );
244
- } else
245
- obj = tbody[0];
246
- }
284
+ jQuery.each( a, function(){
285
+ fn.apply( obj, [ clone ? this.cloneNode(true) : this ] );
286
+ });
247
287
 
248
- for ( var i = ( dir < 0 ? a.length - 1 : 0 );
249
- i != ( dir < 0 ? dir : a.length ); i += dir ) {
250
- fn.apply( obj, [ clone ? a[i].cloneNode(true) : a[i] ] );
251
- }
252
288
  });
253
- },
254
- pushStack: function(a,args) {
255
- var fn = args && args[args.length-1];
256
- var fn2 = args && args[args.length-2];
257
-
258
- if ( fn && fn.constructor != Function ) fn = null;
259
- if ( fn2 && fn2.constructor != Function ) fn2 = null;
260
-
261
- if ( !fn ) {
262
- if ( !this.stack ) this.stack = [];
263
- this.stack.push( this.get() );
264
- this.get( a );
265
- } else {
266
- var old = this.get();
267
- this.get( a );
289
+ }
290
+ };
268
291
 
269
- if ( fn2 && a.length || !fn2 )
270
- this.each( fn2 || fn ).get( old );
271
- else
272
- this.get( old ).each( fn );
273
- }
292
+ jQuery.extend = jQuery.fn.extend = function() {
293
+ // copy reference to target object
294
+ var target = arguments[0], a = 1;
274
295
 
275
- return this;
296
+ // extend jQuery itself if only one argument is passed
297
+ if ( arguments.length == 1 ) {
298
+ target = this;
299
+ a = 0;
276
300
  }
277
- };
301
+ var prop;
302
+ while ( (prop = arguments[a++]) != null )
303
+ // Extend the base object
304
+ for ( var i in prop ) target[i] = prop[i];
278
305
 
279
- jQuery.extend = jQuery.fn.extend = function(obj,prop) {
280
- if ( !prop ) { prop = obj; obj = this; }
281
- for ( var i in prop ) obj[i] = prop[i];
282
- return obj;
306
+ // Return the modified object
307
+ return target;
283
308
  };
284
309
 
285
310
  jQuery.extend({
286
- init: function(){
287
- jQuery.initDone = true;
288
-
289
- jQuery.each( jQuery.macros.axis, function(i,n){
290
- jQuery.fn[ i ] = function(a) {
291
- var ret = jQuery.map(this,n);
292
- if ( a && a.constructor == String )
293
- ret = jQuery.filter(a,ret).r;
294
- return this.pushStack( ret, arguments );
295
- };
296
- });
297
-
298
- jQuery.each( jQuery.macros.to, function(i,n){
299
- jQuery.fn[ i ] = function(){
300
- var a = arguments;
301
- return this.each(function(){
302
- for ( var j = 0; j < a.length; j++ )
303
- jQuery(a[j])[n]( this );
304
- });
305
- };
306
- });
307
-
308
- jQuery.each( jQuery.macros.each, function(i,n){
309
- jQuery.fn[ i ] = function() {
310
- return this.each( n, arguments );
311
- };
312
- });
313
-
314
- jQuery.each( jQuery.macros.filter, function(i,n){
315
- jQuery.fn[ n ] = function(num,fn) {
316
- return this.filter( ":" + n + "(" + num + ")", fn );
317
- };
318
- });
319
-
320
- jQuery.each( jQuery.macros.attr, function(i,n){
321
- n = n || i;
322
- jQuery.fn[ i ] = function(h) {
323
- return h == undefined ?
324
- this.length ? this[0][n] : null :
325
- this.attr( n, h );
326
- };
327
- });
311
+ noConflict: function() {
312
+ if ( jQuery._$ )
313
+ $ = jQuery._$;
314
+ return jQuery;
315
+ },
328
316
 
329
- jQuery.each( jQuery.macros.css, function(i,n){
330
- jQuery.fn[ n ] = function(h) {
331
- return h == undefined ?
332
- ( this.length ? jQuery.css( this[0], n ) : null ) :
333
- this.css( n, h );
334
- };
335
- });
317
+ // This may seem like some crazy code, but trust me when I say that this
318
+ // is the only cross-browser way to do this. --John
319
+ isFunction: function( fn ) {
320
+ return !!fn && typeof fn != "string" && !fn.nodeName &&
321
+ fn.constructor != Array && /function/i.test( fn + "" );
322
+ },
323
+
324
+ // check if an element is in a XML document
325
+ isXMLDoc: function(elem) {
326
+ return elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
327
+ },
336
328
 
329
+ nodeName: function( elem, name ) {
330
+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
337
331
  },
332
+ // args is for internal usage only
338
333
  each: function( obj, fn, args ) {
339
334
  if ( obj.length == undefined )
340
335
  for ( var i in obj )
341
336
  fn.apply( obj[i], args || [i, obj[i]] );
342
337
  else
343
- for ( var i = 0; i < obj.length; i++ )
344
- fn.apply( obj[i], args || [i, obj[i]] );
338
+ for ( var i = 0, ol = obj.length; i < ol; i++ )
339
+ if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
345
340
  return obj;
346
341
  },
342
+
343
+ prop: function(elem, value, type, index, prop){
344
+ // Handle executable functions
345
+ if ( jQuery.isFunction( value ) )
346
+ value = value.call( elem, [index] );
347
+
348
+ // exclude the following css properties to add px
349
+ var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;
350
+
351
+ // Handle passing in a number to a CSS property
352
+ return value && value.constructor == Number && type == "curCSS" && !exclude.test(prop) ?
353
+ value + "px" :
354
+ value;
355
+ },
347
356
 
348
357
  className: {
349
- add: function(o,c){
350
- if (jQuery.className.has(o,c)) return;
351
- o.className += ( o.className ? " " : "" ) + c;
358
+ // internal only, use addClass("class")
359
+ add: function( elem, c ){
360
+ jQuery.each( c.split(/\s+/), function(i, cur){
361
+ if ( !jQuery.className.has( elem.className, cur ) )
362
+ elem.className += ( elem.className ? " " : "" ) + cur;
363
+ });
352
364
  },
353
- remove: function(o,c){
354
- if( !c ) {
355
- o.className = "";
356
- } else {
357
- var classes = o.className.split(" ");
358
- for(var i=0; i<classes.length; i++) {
359
- if(classes[i] == c) {
360
- classes.splice(i, 1);
361
- break;
362
- }
363
- }
364
- o.className = classes.join(' ');
365
- }
365
+
366
+ // internal only, use removeClass("class")
367
+ remove: function( elem, c ){
368
+ elem.className = c != undefined ?
369
+ jQuery.grep( elem.className.split(/\s+/), function(cur){
370
+ return !jQuery.className.has( c, cur );
371
+ }).join(" ") : "";
366
372
  },
367
- has: function(e,a) {
368
- if ( e.className != undefined )
369
- e = e.className;
370
- return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e);
373
+
374
+ // internal only, use is(".class")
375
+ has: function( t, c ) {
376
+ return jQuery.inArray( c, (t.className || t).toString().split(/\s+/) ) > -1;
371
377
  }
372
378
  },
373
379
  swap: function(e,o,f) {
@@ -384,28 +390,30 @@ jQuery.extend({
384
390
  if ( p == "height" || p == "width" ) {
385
391
  var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
386
392
 
387
- for ( var i in d ) {
388
- old["padding" + d[i]] = 0;
389
- old["border" + d[i] + "Width"] = 0;
390
- }
393
+ jQuery.each( d, function(){
394
+ old["padding" + this] = 0;
395
+ old["border" + this + "Width"] = 0;
396
+ });
391
397
 
392
398
  jQuery.swap( e, old, function() {
393
- if (jQuery.css(e,"display") != "none") {
399
+ if ( jQuery(e).is(':visible') ) {
394
400
  oHeight = e.offsetHeight;
395
401
  oWidth = e.offsetWidth;
396
402
  } else {
397
- e = jQuery(e.cloneNode(true)).css({
398
- visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
399
- }).appendTo(e.parentNode)[0];
400
-
401
- var parPos = jQuery.css(e.parentNode,"position");
402
- if ( parPos == "" || parPos == "static" )
403
+ e = jQuery(e.cloneNode(true))
404
+ .find(":radio").removeAttr("checked").end()
405
+ .css({
406
+ visibility: "hidden", position: "absolute", display: "block", right: "0", left: "0"
407
+ }).appendTo(e.parentNode)[0];
408
+
409
+ var parPos = jQuery.css(e.parentNode,"position") || "static";
410
+ if ( parPos == "static" )
403
411
  e.parentNode.style.position = "relative";
404
412
 
405
413
  oHeight = e.clientHeight;
406
414
  oWidth = e.clientWidth;
407
415
 
408
- if ( parPos == "" || parPos == "static" )
416
+ if ( parPos == "static" )
409
417
  e.parentNode.style.position = "static";
410
418
 
411
419
  e.parentNode.removeChild(e);
@@ -420,434 +428,218 @@ jQuery.extend({
420
428
 
421
429
  curCSS: function(elem, prop, force) {
422
430
  var ret;
423
-
424
- if (prop == 'opacity' && jQuery.browser.msie)
425
- return jQuery.attr(elem.style, 'opacity');
426
431
 
427
- if (!force && elem.style[prop]) {
432
+ if (prop == "opacity" && jQuery.browser.msie) {
433
+ ret = jQuery.attr(elem.style, "opacity");
434
+ return ret == "" ? "1" : ret;
435
+ }
436
+
437
+ if (prop.match(/float/i))
438
+ prop = jQuery.styleFloat;
428
439
 
440
+ if (!force && elem.style[prop])
429
441
  ret = elem.style[prop];
430
442
 
431
- } else if (elem.currentStyle) {
432
-
433
- var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
434
- ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
443
+ else if (document.defaultView && document.defaultView.getComputedStyle) {
435
444
 
436
- } else if (document.defaultView && document.defaultView.getComputedStyle) {
445
+ if (prop.match(/float/i))
446
+ prop = "float";
437
447
 
438
448
  prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
439
449
  var cur = document.defaultView.getComputedStyle(elem, null);
440
450
 
441
451
  if ( cur )
442
452
  ret = cur.getPropertyValue(prop);
443
- else if ( prop == 'display' )
444
- ret = 'none';
453
+ else if ( prop == "display" )
454
+ ret = "none";
445
455
  else
446
- jQuery.swap(elem, { display: 'block' }, function() {
447
- ret = document.defaultView.getComputedStyle(this,null).getPropertyValue(prop);
456
+ jQuery.swap(elem, { display: "block" }, function() {
457
+ var c = document.defaultView.getComputedStyle(this, "");
458
+ ret = c && c.getPropertyValue(prop) || "";
448
459
  });
449
460
 
461
+ } else if (elem.currentStyle) {
462
+ var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase();});
463
+ ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
450
464
  }
451
465
 
452
466
  return ret;
453
467
  },
454
-
455
- clean: function(a) {
468
+
469
+ clean: function(a, doc) {
456
470
  var r = [];
457
- for ( var i = 0; i < a.length; i++ ) {
458
- if ( a[i].constructor == String ) {
459
- // trim whitespace, otherwise indexOf won't work as expected
460
- a[i] = jQuery.trim(a[i]);
461
-
462
- var table = "";
463
-
464
- if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
465
- table = "thead";
466
- a[i] = "<table>" + a[i] + "</table>";
467
- } else if ( !a[i].indexOf("<tr") ) {
468
- table = "tr";
469
- a[i] = "<table>" + a[i] + "</table>";
470
- } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
471
- table = "td";
472
- a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
473
- }
474
-
475
- var div = document.createElement("div");
476
- div.innerHTML = a[i];
477
-
478
- if ( table ) {
479
- div = div.firstChild;
480
- if ( table != "thead" ) div = div.firstChild;
481
- if ( table == "td" ) div = div.firstChild;
482
- }
483
-
484
- for ( var j = 0; j < div.childNodes.length; j++ )
485
- r.push( div.childNodes[j] );
486
- } else if ( a[i].jquery || a[i].length && !a[i].nodeType )
487
- for ( var k = 0; k < a[i].length; k++ )
488
- r.push( a[i][k] );
489
- else if ( a[i] !== null )
490
- r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
491
- }
492
- return r;
493
- },
494
-
495
- expr: {
496
- "": "m[2]== '*'||a.nodeName.toUpperCase()==m[2].toUpperCase()",
497
- "#": "a.getAttribute('id')&&a.getAttribute('id')==m[2]",
498
- ":": {
499
- // Position Checks
500
- lt: "i<m[3]-0",
501
- gt: "i>m[3]-0",
502
- nth: "m[3]-0==i",
503
- eq: "m[3]-0==i",
504
- first: "i==0",
505
- last: "i==r.length-1",
506
- even: "i%2==0",
507
- odd: "i%2",
508
-
509
- // Child Checks
510
- "nth-child": "jQuery.sibling(a,m[3]).cur",
511
- "first-child": "jQuery.sibling(a,0).cur",
512
- "last-child": "jQuery.sibling(a,0).last",
513
- "only-child": "jQuery.sibling(a).length==1",
514
-
515
- // Parent Checks
516
- parent: "a.childNodes.length",
517
- empty: "!a.childNodes.length",
518
-
519
- // Text Check
520
- contains: "(a.innerText||a.innerHTML).indexOf(m[3])>=0",
521
-
522
- // Visibility
523
- visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
524
- hidden: "a.type=='hidden'||jQuery.css(a,'display')=='none'||jQuery.css(a,'visibility')=='hidden'",
525
-
526
- // Form attributes
527
- enabled: "!a.disabled",
528
- disabled: "a.disabled",
529
- checked: "a.checked",
530
- selected: "a.selected || jQuery.attr(a, 'selected')",
531
-
532
- // Form elements
533
- text: "a.type=='text'",
534
- radio: "a.type=='radio'",
535
- checkbox: "a.type=='checkbox'",
536
- file: "a.type=='file'",
537
- password: "a.type=='password'",
538
- submit: "a.type=='submit'",
539
- image: "a.type=='image'",
540
- reset: "a.type=='reset'",
541
- button: "a.type=='button'",
542
- input: "a.nodeName.toLowerCase().match(/input|select|textarea|button/)"
543
- },
544
- ".": "jQuery.className.has(a,m[2])",
545
- "@": {
546
- "=": "z==m[4]",
547
- "!=": "z!=m[4]",
548
- "^=": "z && !z.indexOf(m[4])",
549
- "$=": "z && z.substr(z.length - m[4].length,m[4].length)==m[4]",
550
- "*=": "z && z.indexOf(m[4])>=0",
551
- "": "z"
552
- },
553
- "[": "jQuery.find(m[2],a).length"
554
- },
471
+ doc = doc || document;
555
472
 
556
- token: [
557
- "\\.\\.|/\\.\\.", "a.parentNode",
558
- ">|/", "jQuery.sibling(a.firstChild)",
559
- "\\+", "jQuery.sibling(a).next",
560
- "~", function(a){
561
- var r = [];
562
- var s = jQuery.sibling(a);
563
- if ( s.n > 0 )
564
- for ( var i = s.n; i < s.length; i++ )
565
- r.push( s[i] );
566
- return r;
567
- }
568
- ],
569
- find: function( t, context ) {
570
- // Make sure that the context is a DOM Element
571
- if ( context && context.nodeType == undefined )
572
- context = null;
573
-
574
- // Set the correct context (if none is provided)
575
- context = context || jQuery.context || document;
576
-
577
- if ( t.constructor != String ) return [t];
578
-
579
- if ( !t.indexOf("//") ) {
580
- context = context.documentElement;
581
- t = t.substr(2,t.length);
582
- } else if ( !t.indexOf("/") ) {
583
- context = context.documentElement;
584
- t = t.substr(1,t.length);
585
- // FIX Assume the root element is right :(
586
- if ( t.indexOf("/") >= 1 )
587
- t = t.substr(t.indexOf("/"),t.length);
588
- }
589
-
590
- var ret = [context];
591
- var done = [];
592
- var last = null;
593
-
594
- while ( t.length > 0 && last != t ) {
595
- var r = [];
596
- last = t;
597
-
598
- t = jQuery.trim(t).replace( /^\/\//i, "" );
599
-
600
- var foundToken = false;
601
-
602
- for ( var i = 0; i < jQuery.token.length; i += 2 ) {
603
- if ( foundToken ) continue;
473
+ jQuery.each( a, function(i,arg){
474
+ if ( !arg ) return;
604
475
 
605
- var re = new RegExp("^(" + jQuery.token[i] + ")");
606
- var m = re.exec(t);
607
-
608
- if ( m ) {
609
- r = ret = jQuery.map( ret, jQuery.token[i+1] );
610
- t = jQuery.trim( t.replace( re, "" ) );
611
- foundToken = true;
612
- }
613
- }
476
+ if ( arg.constructor == Number )
477
+ arg = arg.toString();
478
+
479
+ // Convert html string into DOM nodes
480
+ if ( typeof arg == "string" ) {
481
+ // Trim whitespace, otherwise indexOf won't work as expected
482
+ var s = jQuery.trim(arg).toLowerCase(), div = doc.createElement("div"), tb = [];
483
+
484
+ var wrap =
485
+ // option or optgroup
486
+ !s.indexOf("<opt") &&
487
+ [1, "<select>", "</select>"] ||
488
+
489
+ !s.indexOf("<leg") &&
490
+ [1, "<fieldset>", "</fieldset>"] ||
491
+
492
+ (!s.indexOf("<thead") || !s.indexOf("<tbody") || !s.indexOf("<tfoot") || !s.indexOf("<colg")) &&
493
+ [1, "<table>", "</table>"] ||
494
+
495
+ !s.indexOf("<tr") &&
496
+ [2, "<table><tbody>", "</tbody></table>"] ||
497
+
498
+ // <thead> matched above
499
+ (!s.indexOf("<td") || !s.indexOf("<th")) &&
500
+ [3, "<table><tbody><tr>", "</tr></tbody></table>"] ||
501
+
502
+ !s.indexOf("<col") &&
503
+ [2, "<table><colgroup>", "</colgroup></table>"] ||
504
+
505
+ [0,"",""];
614
506
 
615
- if ( !foundToken ) {
616
- if ( !t.indexOf(",") || !t.indexOf("|") ) {
617
- if ( ret[0] == context ) ret.shift();
618
- done = jQuery.merge( done, ret );
619
- r = ret = [context];
620
- t = " " + t.substr(1,t.length);
621
- } else {
622
- var re2 = /^([#.]?)([a-z0-9\\*_-]*)/i;
623
- var m = re2.exec(t);
507
+ // Go to html and back, then peel off extra wrappers
508
+ div.innerHTML = wrap[1] + arg + wrap[2];
509
+
510
+ // Move to the right depth
511
+ while ( wrap[0]-- )
512
+ div = div.firstChild;
513
+
514
+ // Remove IE's autoinserted <tbody> from table fragments
515
+ if ( jQuery.browser.msie ) {
516
+
517
+ // String was a <table>, *may* have spurious <tbody>
518
+ if ( !s.indexOf("<table") && s.indexOf("<tbody") < 0 )
519
+ tb = div.firstChild && div.firstChild.childNodes;
520
+
521
+ // String was a bare <thead> or <tfoot>
522
+ else if ( wrap[1] == "<table>" && s.indexOf("<tbody") < 0 )
523
+ tb = div.childNodes;
624
524
 
625
- if ( m[1] == "#" ) {
626
- // Ummm, should make this work in all XML docs
627
- var oid = document.getElementById(m[2]);
628
- r = ret = oid ? [oid] : [];
629
- t = t.replace( re2, "" );
630
- } else {
631
- if ( !m[2] || m[1] == "." ) m[2] = "*";
632
-
633
- for ( var i = 0; i < ret.length; i++ )
634
- r = jQuery.merge( r,
635
- m[2] == "*" ?
636
- jQuery.getAll(ret[i]) :
637
- ret[i].getElementsByTagName(m[2])
638
- );
639
- }
525
+ for ( var n = tb.length-1; n >= 0 ; --n )
526
+ if ( jQuery.nodeName(tb[n], "tbody") && !tb[n].childNodes.length )
527
+ tb[n].parentNode.removeChild(tb[n]);
528
+
640
529
  }
641
-
530
+
531
+ arg = jQuery.makeArray( div.childNodes );
642
532
  }
643
533
 
644
- if ( t ) {
645
- var val = jQuery.filter(t,r);
646
- ret = r = val.r;
647
- t = jQuery.trim(val.t);
648
- }
649
- }
534
+ if ( 0 === arg.length && (!jQuery.nodeName(arg, "form") && !jQuery.nodeName(arg, "select")) )
535
+ return;
650
536
 
651
- if ( ret && ret[0] == context ) ret.shift();
652
- done = jQuery.merge( done, ret );
537
+ if ( arg[0] == undefined || jQuery.nodeName(arg, "form") || arg.options )
538
+ r.push( arg );
539
+ else
540
+ r = jQuery.merge( r, arg );
653
541
 
654
- return done;
655
- },
542
+ });
656
543
 
657
- getAll: function(o,r) {
658
- r = r || [];
659
- var s = o.childNodes;
660
- for ( var i = 0; i < s.length; i++ )
661
- if ( s[i].nodeType == 1 ) {
662
- r.push( s[i] );
663
- jQuery.getAll( s[i], r );
664
- }
665
544
  return r;
666
545
  },
667
-
546
+
668
547
  attr: function(elem, name, value){
669
- var fix = {
670
- "for": "htmlFor",
671
- "class": "className",
672
- "float": "cssFloat",
673
- innerHTML: "innerHTML",
674
- className: "className",
675
- value: "value",
676
- disabled: "disabled",
677
- checked: "checked"
678
- };
679
-
680
- // IE actually uses filters for opacity ... elem is actually elem.style
681
- if (name == "opacity" && jQuery.browser.msie && value != undefined) {
682
- // IE has trouble with opacity if it does not have layout
683
- // Would prefer to check element.hasLayout first but don't have access to the element here
684
- elem['zoom'] = 1;
685
- if (value == 1) // Remove filter to avoid more IE weirdness
686
- return elem["filter"] = elem["filter"].replace(/alpha\([^\)]*\)/gi,"");
687
- else
688
- return elem["filter"] = elem["filter"].replace(/alpha\([^\)]*\)/gi,"") + "alpha(opacity=" + value * 100 + ")";
689
- } else if (name == "opacity" && jQuery.browser.msie) {
690
- return elem["filter"] ? parseFloat( elem["filter"].match(/alpha\(opacity=(.*)\)/)[1] )/100 : 1;
691
- }
548
+ var fix = jQuery.isXMLDoc(elem) ? {} : jQuery.props;
692
549
 
693
- // Mozilla doesn't play well with opacity 1
694
- if (name == "opacity" && jQuery.browser.mozilla && value == 1) value = 0.9999;
695
-
550
+ // Certain attributes only work when accessed via the old DOM 0 way
696
551
  if ( fix[name] ) {
697
552
  if ( value != undefined ) elem[fix[name]] = value;
698
553
  return elem[fix[name]];
699
- } else if( value == undefined && jQuery.browser.msie && elem.nodeName && elem.nodeName.toUpperCase() == 'FORM' && (name == 'action' || name == 'method') ) {
554
+
555
+ } else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName(elem, "form") && (name == "action" || name == "method") )
700
556
  return elem.getAttributeNode(name).nodeValue;
701
- } else if ( elem.getAttribute != undefined ) {
557
+
558
+ // IE elem.getAttribute passes even for style
559
+ else if ( elem.tagName ) {
560
+
561
+
702
562
  if ( value != undefined ) elem.setAttribute( name, value );
703
- return elem.getAttribute( name, 2 );
563
+ if ( jQuery.browser.msie && /href|src/.test(name) && !jQuery.isXMLDoc(elem) )
564
+ return elem.getAttribute( name, 2 );
565
+ return elem.getAttribute( name );
566
+
567
+ // elem is actually elem.style ... set the style
704
568
  } else {
569
+ // IE actually uses filters for opacity
570
+ if ( name == "opacity" && jQuery.browser.msie ) {
571
+ if ( value != undefined ) {
572
+ // IE has trouble with opacity if it does not have layout
573
+ // Force it by setting the zoom level
574
+ elem.zoom = 1;
575
+
576
+ // Set the alpha filter to set the opacity
577
+ elem.filter = (elem.filter || "").replace(/alpha\([^)]*\)/,"") +
578
+ (parseFloat(value).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
579
+ }
580
+
581
+ return elem.filter ?
582
+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() : "";
583
+ }
705
584
  name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
706
585
  if ( value != undefined ) elem[name] = value;
707
586
  return elem[name];
708
587
  }
709
588
  },
589
+ trim: function(t){
590
+ return t.replace(/^\s+|\s+$/g, "");
591
+ },
710
592
 
711
- // The regular expressions that power the parsing engine
712
- parse: [
713
- // Match: [@value='test'], [@foo]
714
- "\\[ *(@)S *([!*$^=]*) *('?\"?)(.*?)\\4 *\\]",
715
-
716
- // Match: [div], [div p]
717
- "(\\[)\s*(.*?)\s*\\]",
593
+ makeArray: function( a ) {
594
+ var r = [];
718
595
 
719
- // Match: :contains('foo')
720
- "(:)S\\(\"?'?([^\\)]*?)\"?'?\\)",
596
+ // Need to use typeof to fight Safari childNodes crashes
597
+ if ( typeof a != "array" )
598
+ for ( var i = 0, al = a.length; i < al; i++ )
599
+ r.push( a[i] );
600
+ else
601
+ r = a.slice( 0 );
721
602
 
722
- // Match: :even, :last-chlid
723
- "([:.#]*)S"
724
- ],
603
+ return r;
604
+ },
725
605
 
726
- filter: function(t,r,not) {
727
- // Figure out if we're doing regular, or inverse, filtering
728
- var g = not !== false ? jQuery.grep :
729
- function(a,f) {return jQuery.grep(a,f,true);};
730
-
731
- while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
732
-
733
- var p = jQuery.parse;
734
-
735
- for ( var i = 0; i < p.length; i++ ) {
736
-
737
- // Look for, and replace, string-like sequences
738
- // and finally build a regexp out of it
739
- var re = new RegExp(
740
- "^" + p[i].replace("S", "([a-z*_-][a-z0-9_-]*)"), "i" );
741
-
742
- var m = re.exec( t );
743
-
744
- if ( m ) {
745
- // Re-organize the first match
746
- if ( !i )
747
- m = ["",m[1], m[3], m[2], m[5]];
748
-
749
- // Remove what we just matched
750
- t = t.replace( re, "" );
751
-
752
- break;
753
- }
754
- }
755
-
756
- // :not() is a special case that can be optimized by
757
- // keeping it out of the expression list
758
- if ( m[1] == ":" && m[2] == "not" )
759
- r = jQuery.filter(m[3],r,false).r;
760
-
761
- // Otherwise, find the expression to execute
762
- else {
763
- var f = jQuery.expr[m[1]];
764
- if ( f.constructor != String )
765
- f = jQuery.expr[m[1]][m[2]];
766
-
767
- // Build a custom macro to enclose it
768
- eval("f = function(a,i){" +
769
- ( m[1] == "@" ? "z=jQuery.attr(a,m[3]);" : "" ) +
770
- "return " + f + "}");
771
-
772
- // Execute it against the current filter
773
- r = g( r, f );
774
- }
775
- }
776
-
777
- // Return an array of filtered elements (r)
778
- // and the modified expression string (t)
779
- return { r: r, t: t };
780
- },
781
- trim: function(t){
782
- return t.replace(/^\s+|\s+$/g, "");
606
+ inArray: function( b, a ) {
607
+ for ( var i = 0, al = a.length; i < al; i++ )
608
+ if ( a[i] == b )
609
+ return i;
610
+ return -1;
783
611
  },
784
- parents: function( elem ){
785
- var matched = [];
786
- var cur = elem.parentNode;
787
- while ( cur && cur != document ) {
788
- matched.push( cur );
789
- cur = cur.parentNode;
790
- }
791
- return matched;
792
- },
793
- sibling: function(elem, pos, not) {
794
- var elems = [];
795
-
796
- if(elem) {
797
- var siblings = elem.parentNode.childNodes;
798
- for ( var i = 0; i < siblings.length; i++ ) {
799
- if ( not === true && siblings[i] == elem ) continue;
800
-
801
- if ( siblings[i].nodeType == 1 )
802
- elems.push( siblings[i] );
803
- if ( siblings[i] == elem )
804
- elems.n = elems.length - 1;
612
+ merge: function(first, second) {
613
+ // We have to loop this way because IE & Opera overwrite the length
614
+ // expando of getElementsByTagName
615
+ for ( var i = 0; second[i]; i++ )
616
+ first.push(second[i]);
617
+ return first;
618
+ },
619
+ unique: function(first) {
620
+ var r = [], num = jQuery.mergeNum++;
621
+
622
+ for ( var i = 0, fl = first.length; i < fl; i++ )
623
+ if ( num != first[i].mergeNum ) {
624
+ first[i].mergeNum = num;
625
+ r.push(first[i]);
805
626
  }
806
- }
807
627
 
808
- return jQuery.extend( elems, {
809
- last: elems.n == elems.length - 1,
810
- cur: pos == "even" && elems.n % 2 == 0 || pos == "odd" && elems.n % 2 || elems[pos] == elem,
811
- prev: elems[elems.n - 1],
812
- next: elems[elems.n + 1]
813
- });
628
+ return r;
814
629
  },
815
- merge: function(first, second) {
816
- var result = [];
817
630
 
818
- // Move b over to the new array (this helps to avoid
819
- // StaticNodeList instances)
820
- for ( var k = 0; k < first.length; k++ )
821
- result[k] = first[k];
822
-
823
- // Now check for duplicates between a and b and only
824
- // add the unique items
825
- for ( var i = 0; i < second.length; i++ ) {
826
- var noCollision = true;
827
-
828
- // The collision-checking process
829
- for ( var j = 0; j < first.length; j++ )
830
- if ( second[i] == first[j] )
831
- noCollision = false;
832
-
833
- // If the item is unique, add it
834
- if ( noCollision )
835
- result.push( second[i] );
836
- }
837
-
838
- return result;
839
- },
631
+ mergeNum: 0,
840
632
  grep: function(elems, fn, inv) {
841
633
  // If a string is passed in for the function, make a function
842
634
  // for it (a handy shortcut)
843
- if ( fn.constructor == String )
635
+ if ( typeof fn == "string" )
844
636
  fn = new Function("a","i","return " + fn);
845
637
 
846
638
  var result = [];
847
639
 
848
640
  // Go through the array, only saving the items
849
641
  // that pass the validator function
850
- for ( var i = 0; i < elems.length; i++ )
642
+ for ( var i = 0, el = elems.length; i < el; i++ )
851
643
  if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
852
644
  result.push( elems[i] );
853
645
 
@@ -856,295 +648,866 @@ jQuery.extend({
856
648
  map: function(elems, fn) {
857
649
  // If a string is passed in for the function, make a function
858
650
  // for it (a handy shortcut)
859
- if ( fn.constructor == String )
651
+ if ( typeof fn == "string" )
860
652
  fn = new Function("a","return " + fn);
861
653
 
862
654
  var result = [];
863
655
 
864
656
  // Go through the array, translating each of the items to their
865
657
  // new value (or values).
866
- for ( var i = 0; i < elems.length; i++ ) {
658
+ for ( var i = 0, el = elems.length; i < el; i++ ) {
867
659
  var val = fn(elems[i],i);
868
660
 
869
661
  if ( val !== null && val != undefined ) {
870
662
  if ( val.constructor != Array ) val = [val];
871
- result = jQuery.merge( result, val );
663
+ result = result.concat( val );
872
664
  }
873
665
  }
874
666
 
875
667
  return result;
668
+ }
669
+ });
670
+
671
+ /*
672
+ * Whether the W3C compliant box model is being used.
673
+ *
674
+ * @property
675
+ * @name $.boxModel
676
+ * @type Boolean
677
+ * @cat JavaScript
678
+ */
679
+ new function() {
680
+ var b = navigator.userAgent.toLowerCase();
681
+
682
+ // Figure out what browser is being used
683
+ jQuery.browser = {
684
+ version: (b.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1],
685
+ safari: /webkit/.test(b),
686
+ opera: /opera/.test(b),
687
+ msie: /msie/.test(b) && !/opera/.test(b),
688
+ mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
689
+ };
690
+
691
+ // Check to see if the W3C box model is being used
692
+ jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
693
+
694
+ jQuery.styleFloat = jQuery.browser.msie ? "styleFloat" : "cssFloat",
695
+
696
+ jQuery.props = {
697
+ "for": "htmlFor",
698
+ "class": "className",
699
+ "float": jQuery.styleFloat,
700
+ cssFloat: jQuery.styleFloat,
701
+ styleFloat: jQuery.styleFloat,
702
+ innerHTML: "innerHTML",
703
+ className: "className",
704
+ value: "value",
705
+ disabled: "disabled",
706
+ checked: "checked",
707
+ readonly: "readOnly",
708
+ selected: "selected",
709
+ maxlength: "maxLength"
710
+ };
711
+ };
712
+
713
+ jQuery.each({
714
+ parent: "a.parentNode",
715
+ parents: "jQuery.parents(a)",
716
+ next: "jQuery.nth(a,2,'nextSibling')",
717
+ prev: "jQuery.nth(a,2,'previousSibling')",
718
+ siblings: "jQuery.sibling(a.parentNode.firstChild,a)",
719
+ children: "jQuery.sibling(a.firstChild)"
720
+ }, function(i,n){
721
+ jQuery.fn[ i ] = function(a) {
722
+ var ret = jQuery.map(this,n);
723
+ if ( a && typeof a == "string" )
724
+ ret = jQuery.multiFilter(a,ret);
725
+ return this.pushStack( ret );
726
+ };
727
+ });
728
+
729
+ jQuery.each({
730
+ appendTo: "append",
731
+ prependTo: "prepend",
732
+ insertBefore: "before",
733
+ insertAfter: "after"
734
+ }, function(i,n){
735
+ jQuery.fn[ i ] = function(){
736
+ var a = arguments;
737
+ return this.each(function(){
738
+ for ( var j = 0, al = a.length; j < al; j++ )
739
+ jQuery(a[j])[n]( this );
740
+ });
741
+ };
742
+ });
743
+
744
+ jQuery.each( {
745
+ removeAttr: function( key ) {
746
+ jQuery.attr( this, key, "" );
747
+ this.removeAttribute( key );
748
+ },
749
+ addClass: function(c){
750
+ jQuery.className.add(this,c);
751
+ },
752
+ removeClass: function(c){
753
+ jQuery.className.remove(this,c);
876
754
  },
755
+ toggleClass: function( c ){
756
+ jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this, c);
757
+ },
758
+ remove: function(a){
759
+ if ( !a || jQuery.filter( a, [this] ).r.length )
760
+ this.parentNode.removeChild( this );
761
+ },
762
+ empty: function() {
763
+ while ( this.firstChild )
764
+ this.removeChild( this.firstChild );
765
+ }
766
+ }, function(i,n){
767
+ jQuery.fn[ i ] = function() {
768
+ return this.each( n, arguments );
769
+ };
770
+ });
877
771
 
878
- /*
879
- * A number of helper functions used for managing events.
880
- * Many of the ideas behind this code orignated from Dean Edwards' addEvent library.
881
- */
882
- event: {
883
-
884
- // Bind an event to an element
885
- // Original by Dean Edwards
886
- add: function(element, type, handler) {
887
- // For whatever reason, IE has trouble passing the window object
888
- // around, causing it to be cloned in the process
889
- if ( jQuery.browser.msie && element.setInterval != undefined )
890
- element = window;
891
-
892
- // Make sure that the function being executed has a unique ID
893
- if ( !handler.guid )
894
- handler.guid = this.guid++;
895
-
896
- // Init the element's event structure
897
- if (!element.events)
898
- element.events = {};
899
-
900
- // Get the current list of functions bound to this event
901
- var handlers = element.events[type];
902
-
903
- // If it hasn't been initialized yet
904
- if (!handlers) {
905
- // Init the event handler queue
906
- handlers = element.events[type] = {};
907
-
908
- // Remember an existing handler, if it's already there
909
- if (element["on" + type])
910
- handlers[0] = element["on" + type];
911
- }
772
+ jQuery.each( [ "eq", "lt", "gt", "contains" ], function(i,n){
773
+ jQuery.fn[ n ] = function(num,fn) {
774
+ return this.filter( ":" + n + "(" + num + ")", fn );
775
+ };
776
+ });
777
+
778
+ jQuery.each( [ "height", "width" ], function(i,n){
779
+ jQuery.fn[ n ] = function(h) {
780
+ return h == undefined ?
781
+ ( this.length ? jQuery.css( this[0], n ) : null ) :
782
+ this.css( n, h.constructor == String ? h : h + "px" );
783
+ };
784
+ });
785
+ jQuery.extend({
786
+ expr: {
787
+ "": "m[2]=='*'||jQuery.nodeName(a,m[2])",
788
+ "#": "a.getAttribute('id')==m[2]",
789
+ ":": {
790
+ // Position Checks
791
+ lt: "i<m[3]-0",
792
+ gt: "i>m[3]-0",
793
+ nth: "m[3]-0==i",
794
+ eq: "m[3]-0==i",
795
+ first: "i==0",
796
+ last: "i==r.length-1",
797
+ even: "i%2==0",
798
+ odd: "i%2",
912
799
 
913
- // Add the function to the element's handler list
914
- handlers[handler.guid] = handler;
800
+ // Child Checks
801
+ "first-child": "a.parentNode.getElementsByTagName('*')[0]==a",
802
+ "last-child": "jQuery.nth(a.parentNode.lastChild,1,'previousSibling')==a",
803
+ "only-child": "!jQuery.nth(a.parentNode.lastChild,2,'previousSibling')",
915
804
 
916
- // And bind the global event handler to the element
917
- element["on" + type] = this.handle;
805
+ // Parent Checks
806
+ parent: "a.firstChild",
807
+ empty: "!a.firstChild",
918
808
 
919
- // Remember the function in a global list (for triggering)
920
- if (!this.global[type])
921
- this.global[type] = [];
922
- this.global[type].push( element );
923
- },
809
+ // Text Check
810
+ contains: "(a.textContent||a.innerText||'').indexOf(m[3])>=0",
924
811
 
925
- guid: 1,
926
- global: {},
812
+ // Visibility
813
+ visible: '"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden"',
814
+ hidden: '"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden"',
927
815
 
928
- // Detach an event or set of events from an element
929
- remove: function(element, type, handler) {
930
- if (element.events)
931
- if (type && element.events[type])
932
- if ( handler )
933
- delete element.events[type][handler.guid];
934
- else
935
- for ( var i in element.events[type] )
936
- delete element.events[type][i];
937
- else
938
- for ( var j in element.events )
939
- this.remove( element, j );
816
+ // Form attributes
817
+ enabled: "!a.disabled",
818
+ disabled: "a.disabled",
819
+ checked: "a.checked",
820
+ selected: "a.selected||jQuery.attr(a,'selected')",
821
+
822
+ // Form elements
823
+ text: "'text'==a.type",
824
+ radio: "'radio'==a.type",
825
+ checkbox: "'checkbox'==a.type",
826
+ file: "'file'==a.type",
827
+ password: "'password'==a.type",
828
+ submit: "'submit'==a.type",
829
+ image: "'image'==a.type",
830
+ reset: "'reset'==a.type",
831
+ button: '"button"==a.type||jQuery.nodeName(a,"button")',
832
+ input: "/input|select|textarea|button/i.test(a.nodeName)"
940
833
  },
834
+ "[": "jQuery.find(m[2],a).length"
835
+ },
836
+
837
+ // The regular expressions that power the parsing engine
838
+ parse: [
839
+ // Match: [@value='test'], [@foo]
840
+ /^\[ *(@)([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
941
841
 
942
- trigger: function(type,data,element) {
943
- // Touch up the incoming data
944
- data = data || [];
842
+ // Match: [div], [div p]
843
+ /^(\[)\s*(.*?(\[.*?\])?[^[]*?)\s*\]/,
945
844
 
946
- // Handle a global trigger
947
- if ( !element ) {
948
- var g = this.global[type];
949
- if ( g )
950
- for ( var i = 0; i < g.length; i++ )
951
- this.trigger( type, data, g[i] );
845
+ // Match: :contains('foo')
846
+ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
952
847
 
953
- // Handle triggering a single element
954
- } else if ( element["on" + type] ) {
955
- // Pass along a fake event
956
- data.unshift( this.fix({ type: type, target: element }) );
848
+ // Match: :even, :last-chlid, #id, .class
849
+ new RegExp("^([:.#]*)(" +
850
+ ( jQuery.chars = jQuery.browser.safari && jQuery.browser.version < "3.0.0" ? "\\w" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)" ) + "+)")
851
+ ],
957
852
 
958
- // Trigger the event
959
- element["on" + type].apply( element, data );
960
- }
961
- },
853
+ multiFilter: function( expr, elems, not ) {
854
+ var old, cur = [];
855
+
856
+ while ( expr && expr != old ) {
857
+ old = expr;
858
+ var f = jQuery.filter( expr, elems, not );
859
+ expr = f.t.replace(/^\s*,\s*/, "" );
860
+ cur = not ? elems = f.r : jQuery.merge( cur, f.r );
861
+ }
862
+
863
+ return cur;
864
+ },
865
+ find: function( t, context ) {
866
+ // Quickly handle non-string expressions
867
+ if ( typeof t != "string" )
868
+ return [ t ];
869
+
870
+ // Make sure that the context is a DOM Element
871
+ if ( context && !context.nodeType )
872
+ context = null;
873
+
874
+ // Set the correct context (if none is provided)
875
+ context = context || document;
876
+
877
+ // Handle the common XPath // expression
878
+ if ( !t.indexOf("//") ) {
879
+ context = context.documentElement;
880
+ t = t.substr(2,t.length);
881
+
882
+ // And the / root expression
883
+ } else if ( !t.indexOf("/") && !context.ownerDocument ) {
884
+ context = context.documentElement;
885
+ t = t.substr(1,t.length);
886
+ if ( t.indexOf("/") >= 1 )
887
+ t = t.substr(t.indexOf("/"),t.length);
888
+ }
962
889
 
963
- handle: function(event) {
964
- if ( typeof jQuery == "undefined" ) return;
890
+ // Initialize the search
891
+ var ret = [context], done = [], last;
892
+
893
+ // Continue while a selector expression exists, and while
894
+ // we're no longer looping upon ourselves
895
+ while ( t && last != t ) {
896
+ var r = [];
897
+ last = t;
965
898
 
966
- event = event || jQuery.event.fix( window.event );
899
+ t = jQuery.trim(t).replace( /^\/\//, "" );
967
900
 
968
- // If no correct event was found, fail
969
- if ( !event ) return;
901
+ var foundToken = false;
970
902
 
971
- var returnValue = true;
903
+ // An attempt at speeding up child selectors that
904
+ // point to a specific element tag
905
+ var re = new RegExp("^[/>]\\s*(" + jQuery.chars + "+)");
906
+ var m = re.exec(t);
972
907
 
973
- var c = this.events[event.type];
908
+ if ( m ) {
909
+ var nodeName = m[1].toUpperCase();
974
910
 
975
- var args = [].slice.call( arguments, 1 );
976
- args.unshift( event );
911
+ // Perform our own iteration and filter
912
+ for ( var i = 0; ret[i]; i++ )
913
+ for ( var c = ret[i].firstChild; c; c = c.nextSibling )
914
+ if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName.toUpperCase()) )
915
+ r.push( c );
977
916
 
978
- for ( var j in c ) {
979
- if ( c[j].apply( this, args ) === false ) {
980
- event.preventDefault();
981
- event.stopPropagation();
982
- returnValue = false;
917
+ ret = r;
918
+ t = t.replace( re, "" );
919
+ if ( t.indexOf(" ") == 0 ) continue;
920
+ foundToken = true;
921
+ } else {
922
+ re = /^((\/?\.\.)|([>\/+~]))\s*([a-z]*)/i;
923
+
924
+ if ( (m = re.exec(t)) != null ) {
925
+ r = [];
926
+
927
+ var nodeName = m[4], mergeNum = jQuery.mergeNum++;
928
+ m = m[1];
929
+
930
+ for ( var j = 0, rl = ret.length; j < rl; j++ )
931
+ if ( m.indexOf("..") < 0 ) {
932
+ var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
933
+ for ( ; n; n = n.nextSibling )
934
+ if ( n.nodeType == 1 ) {
935
+ if ( m == "~" && n.mergeNum == mergeNum ) break;
936
+
937
+ if (!nodeName || n.nodeName.toUpperCase() == nodeName.toUpperCase() ) {
938
+ if ( m == "~" ) n.mergeNum = mergeNum;
939
+ r.push( n );
940
+ }
941
+
942
+ if ( m == "+" ) break;
943
+ }
944
+ } else
945
+ r.push( ret[j].parentNode );
946
+
947
+ ret = r;
948
+
949
+ // And remove the token
950
+ t = jQuery.trim( t.replace( re, "" ) );
951
+ foundToken = true;
983
952
  }
984
953
  }
985
954
 
986
- return returnValue;
987
- },
955
+ // See if there's still an expression, and that we haven't already
956
+ // matched a token
957
+ if ( t && !foundToken ) {
958
+ // Handle multiple expressions
959
+ if ( !t.indexOf(",") ) {
960
+ // Clean the result set
961
+ if ( context == ret[0] ) ret.shift();
962
+
963
+ // Merge the result sets
964
+ done = jQuery.merge( done, ret );
965
+
966
+ // Reset the context
967
+ r = ret = [context];
968
+
969
+ // Touch up the selector string
970
+ t = " " + t.substr(1,t.length);
971
+
972
+ } else {
973
+ // Optomize for the case nodeName#idName
974
+ var re2 = new RegExp("^(" + jQuery.chars + "+)(#)(" + jQuery.chars + "+)");
975
+ var m = re2.exec(t);
976
+
977
+ // Re-organize the results, so that they're consistent
978
+ if ( m ) {
979
+ m = [ 0, m[2], m[3], m[1] ];
980
+
981
+ } else {
982
+ // Otherwise, do a traditional filter check for
983
+ // ID, class, and element selectors
984
+ re2 = new RegExp("^([#.]?)(" + jQuery.chars + "*)");
985
+ m = re2.exec(t);
986
+ }
987
+
988
+ m[2] = m[2].replace(/\\/g, "");
989
+
990
+ var elem = ret[ret.length-1];
991
+
992
+ // Try to do a global search by ID, where we can
993
+ if ( m[1] == "#" && elem && elem.getElementById ) {
994
+ // Optimization for HTML document case
995
+ var oid = elem.getElementById(m[2]);
996
+
997
+ // Do a quick check for the existence of the actual ID attribute
998
+ // to avoid selecting by the name attribute in IE
999
+ // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
1000
+ if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
1001
+ oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
1002
+
1003
+ // Do a quick check for node name (where applicable) so
1004
+ // that div#foo searches will be really fast
1005
+ ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
1006
+ } else {
1007
+ // We need to find all descendant elements
1008
+ for ( var i = 0; ret[i]; i++ ) {
1009
+ // Grab the tag name being searched for
1010
+ var tag = m[1] != "" || m[0] == "" ? "*" : m[2];
1011
+
1012
+ // Handle IE7 being really dumb about <object>s
1013
+ if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
1014
+ tag = "param";
1015
+
1016
+ r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
1017
+ }
1018
+
1019
+ // It's faster to filter by class and be done with it
1020
+ if ( m[1] == "." )
1021
+ r = jQuery.classFilter( r, m[2] );
1022
+
1023
+ // Same with ID filtering
1024
+ if ( m[1] == "#" ) {
1025
+ var tmp = [];
1026
+
1027
+ // Try to find the element with the ID
1028
+ for ( var i = 0; r[i]; i++ )
1029
+ if ( r[i].getAttribute("id") == m[2] ) {
1030
+ tmp = [ r[i] ];
1031
+ break;
1032
+ }
988
1033
 
989
- fix: function(event) {
990
- if ( event ) {
991
- event.preventDefault = function() {
992
- this.returnValue = false;
993
- };
1034
+ r = tmp;
1035
+ }
1036
+
1037
+ ret = r;
1038
+ }
1039
+
1040
+ t = t.replace( re2, "" );
1041
+ }
994
1042
 
995
- event.stopPropagation = function() {
996
- this.cancelBubble = true;
997
- };
998
1043
  }
999
1044
 
1000
- return event;
1045
+ // If a selector string still exists
1046
+ if ( t ) {
1047
+ // Attempt to filter it
1048
+ var val = jQuery.filter(t,r);
1049
+ ret = r = val.r;
1050
+ t = jQuery.trim(val.t);
1051
+ }
1001
1052
  }
1002
1053
 
1003
- }
1004
- });
1005
- new function() {
1006
- var b = navigator.userAgent.toLowerCase();
1054
+ // An error occurred with the selector;
1055
+ // just return an empty set instead
1056
+ if ( t )
1057
+ ret = [];
1007
1058
 
1008
- // Figure out what browser is being used
1009
- jQuery.browser = {
1010
- safari: /webkit/.test(b),
1011
- opera: /opera/.test(b),
1012
- msie: /msie/.test(b) && !/opera/.test(b),
1013
- mozilla: /mozilla/.test(b) && !/(compatible|webkit)/.test(b)
1014
- };
1059
+ // Remove the root context
1060
+ if ( ret && context == ret[0] )
1061
+ ret.shift();
1015
1062
 
1016
- // Check to see if the W3C box model is being used
1017
- jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
1018
- };
1063
+ // And combine the results
1064
+ done = jQuery.merge( done, ret );
1019
1065
 
1020
- jQuery.macros = {
1021
- to: {
1022
- appendTo: "append",
1023
- prependTo: "prepend",
1024
- insertBefore: "before",
1025
- insertAfter: "after"
1066
+ return done;
1026
1067
  },
1027
1068
 
1028
- css: "width,height,top,left,position,float,overflow,color,background".split(","),
1069
+ classFilter: function(r,m,not){
1070
+ m = " " + m + " ";
1071
+ var tmp = [];
1072
+ for ( var i = 0; r[i]; i++ ) {
1073
+ var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
1074
+ if ( !not && pass || not && !pass )
1075
+ tmp.push( r[i] );
1076
+ }
1077
+ return tmp;
1078
+ },
1029
1079
 
1030
- filter: [ "eq", "lt", "gt", "contains" ],
1080
+ filter: function(t,r,not) {
1081
+ var last;
1031
1082
 
1032
- attr: {
1083
+ // Look for common filter expressions
1084
+ while ( t && t != last ) {
1085
+ last = t;
1033
1086
 
1034
- val: "value",
1087
+ var p = jQuery.parse, m;
1035
1088
 
1036
- html: "innerHTML",
1089
+ for ( var i = 0; p[i]; i++ ) {
1090
+ m = p[i].exec( t );
1037
1091
 
1038
- id: null,
1092
+ if ( m ) {
1093
+ // Remove what we just matched
1094
+ t = t.substring( m[0].length );
1039
1095
 
1040
- title: null,
1096
+ m[2] = m[2].replace(/\\/g, "");
1097
+ break;
1098
+ }
1099
+ }
1041
1100
 
1042
- name: null,
1101
+ if ( !m )
1102
+ break;
1043
1103
 
1044
- href: null,
1104
+ // :not() is a special case that can be optimized by
1105
+ // keeping it out of the expression list
1106
+ if ( m[1] == ":" && m[2] == "not" )
1107
+ r = jQuery.filter(m[3], r, true).r;
1108
+
1109
+ // We can get a big speed boost by filtering by class here
1110
+ else if ( m[1] == "." )
1111
+ r = jQuery.classFilter(r, m[2], not);
1112
+
1113
+ else if ( m[1] == "@" ) {
1114
+ var tmp = [], type = m[3];
1115
+
1116
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
1117
+ var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
1118
+
1119
+ if ( z == null || /href|src/.test(m[2]) )
1120
+ z = jQuery.attr(a,m[2]) || '';
1121
+
1122
+ if ( (type == "" && !!z ||
1123
+ type == "=" && z == m[5] ||
1124
+ type == "!=" && z != m[5] ||
1125
+ type == "^=" && z && !z.indexOf(m[5]) ||
1126
+ type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
1127
+ (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
1128
+ tmp.push( a );
1129
+ }
1130
+
1131
+ r = tmp;
1132
+
1133
+ // We can get a speed boost by handling nth-child here
1134
+ } else if ( m[1] == ":" && m[2] == "nth-child" ) {
1135
+ var num = jQuery.mergeNum++, tmp = [],
1136
+ test = /(\d*)n\+?(\d*)/.exec(
1137
+ m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
1138
+ !/\D/.test(m[3]) && "n+" + m[3] || m[3]),
1139
+ first = (test[1] || 1) - 0, last = test[2] - 0;
1140
+
1141
+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
1142
+ var node = r[i], parentNode = node.parentNode;
1143
+
1144
+ if ( num != parentNode.mergeNum ) {
1145
+ var c = 1;
1146
+
1147
+ for ( var n = parentNode.firstChild; n; n = n.nextSibling )
1148
+ if ( n.nodeType == 1 )
1149
+ n.nodeIndex = c++;
1150
+
1151
+ parentNode.mergeNum = num;
1152
+ }
1153
+
1154
+ var add = false;
1155
+
1156
+ if ( first == 1 ) {
1157
+ if ( last == 0 || node.nodeIndex == last )
1158
+ add = true;
1159
+ } else if ( (node.nodeIndex + last) % first == 0 )
1160
+ add = true;
1161
+
1162
+ if ( add ^ not )
1163
+ tmp.push( node );
1164
+ }
1165
+
1166
+ r = tmp;
1167
+
1168
+ // Otherwise, find the expression to execute
1169
+ } else {
1170
+ var f = jQuery.expr[m[1]];
1171
+ if ( typeof f != "string" )
1172
+ f = jQuery.expr[m[1]][m[2]];
1173
+
1174
+ // Build a custom macro to enclose it
1175
+ eval("f = function(a,i){return " + f + "}");
1045
1176
 
1046
- src: null,
1177
+ // Execute it against the current filter
1178
+ r = jQuery.grep( r, f, not );
1179
+ }
1180
+ }
1047
1181
 
1048
- rel: null
1182
+ // Return an array of filtered elements (r)
1183
+ // and the modified expression string (t)
1184
+ return { r: r, t: t };
1049
1185
  },
1186
+ parents: function( elem ){
1187
+ var matched = [];
1188
+ var cur = elem.parentNode;
1189
+ while ( cur && cur != document ) {
1190
+ matched.push( cur );
1191
+ cur = cur.parentNode;
1192
+ }
1193
+ return matched;
1194
+ },
1195
+ nth: function(cur,result,dir,elem){
1196
+ result = result || 1;
1197
+ var num = 0;
1050
1198
 
1051
- axis: {
1199
+ for ( ; cur; cur = cur[dir] )
1200
+ if ( cur.nodeType == 1 && ++num == result )
1201
+ break;
1052
1202
 
1053
- parent: "a.parentNode",
1203
+ return cur;
1204
+ },
1205
+ sibling: function( n, elem ) {
1206
+ var r = [];
1054
1207
 
1055
- ancestors: jQuery.parents,
1208
+ for ( ; n; n = n.nextSibling ) {
1209
+ if ( n.nodeType == 1 && (!elem || n != elem) )
1210
+ r.push( n );
1211
+ }
1056
1212
 
1057
- parents: jQuery.parents,
1213
+ return r;
1214
+ }
1215
+ });
1216
+ /*
1217
+ * A number of helper functions used for managing events.
1218
+ * Many of the ideas behind this code orignated from
1219
+ * Dean Edwards' addEvent library.
1220
+ */
1221
+ jQuery.event = {
1222
+
1223
+ // Bind an event to an element
1224
+ // Original by Dean Edwards
1225
+ add: function(element, type, handler, data) {
1226
+ // For whatever reason, IE has trouble passing the window object
1227
+ // around, causing it to be cloned in the process
1228
+ if ( jQuery.browser.msie && element.setInterval != undefined )
1229
+ element = window;
1230
+
1231
+ // Make sure that the function being executed has a unique ID
1232
+ if ( !handler.guid )
1233
+ handler.guid = this.guid++;
1234
+
1235
+ // if data is passed, bind to handler
1236
+ if( data != undefined ) {
1237
+ // Create temporary function pointer to original handler
1238
+ var fn = handler;
1239
+
1240
+ // Create unique handler function, wrapped around original handler
1241
+ handler = function() {
1242
+ // Pass arguments and context to original handler
1243
+ return fn.apply(this, arguments);
1244
+ };
1058
1245
 
1059
- next: "jQuery.sibling(a).next",
1246
+ // Store data in unique handler
1247
+ handler.data = data;
1060
1248
 
1061
- prev: "jQuery.sibling(a).prev",
1249
+ // Set the guid of unique handler to the same of original handler, so it can be removed
1250
+ handler.guid = fn.guid;
1251
+ }
1062
1252
 
1063
- siblings: "jQuery.sibling(a, null, true)",
1253
+ // Init the element's event structure
1254
+ if (!element.$events)
1255
+ element.$events = {};
1256
+
1257
+ if (!element.$handle)
1258
+ element.$handle = function() {
1259
+ // returned undefined or false
1260
+ var val;
1261
+
1262
+ // Handle the second event of a trigger and when
1263
+ // an event is called after a page has unloaded
1264
+ if ( typeof jQuery == "undefined" || jQuery.event.triggered )
1265
+ return val;
1266
+
1267
+ val = jQuery.event.handle.apply(element, arguments);
1268
+
1269
+ return val;
1270
+ };
1064
1271
 
1065
- children: "jQuery.sibling(a.firstChild)"
1272
+ // Get the current list of functions bound to this event
1273
+ var handlers = element.$events[type];
1274
+
1275
+ // Init the event handler queue
1276
+ if (!handlers) {
1277
+ handlers = element.$events[type] = {};
1278
+
1279
+ // And bind the global event handler to the element
1280
+ if (element.addEventListener)
1281
+ element.addEventListener(type, element.$handle, false);
1282
+ else
1283
+ element.attachEvent("on" + type, element.$handle);
1284
+ }
1285
+
1286
+ // Add the function to the element's handler list
1287
+ handlers[handler.guid] = handler;
1288
+
1289
+ // Remember the function in a global list (for triggering)
1290
+ if (!this.global[type])
1291
+ this.global[type] = [];
1292
+ // Only add the element to the global list once
1293
+ if (jQuery.inArray(element, this.global[type]) == -1)
1294
+ this.global[type].push( element );
1066
1295
  },
1067
1296
 
1068
- each: {
1069
- removeAttr: function( key ) {
1070
- this.removeAttribute( key );
1071
- },
1072
- show: function(){
1073
- this.style.display = this.oldblock ? this.oldblock : "";
1074
- if ( jQuery.css(this,"display") == "none" )
1075
- this.style.display = "block";
1076
- },
1077
- hide: function(){
1078
- this.oldblock = this.oldblock || jQuery.css(this,"display");
1079
- if ( this.oldblock == "none" )
1080
- this.oldblock = "block";
1081
- this.style.display = "none";
1082
- },
1083
- toggle: function(){
1084
- jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ].apply( jQuery(this), arguments );
1085
- },
1086
- addClass: function(c){
1087
- jQuery.className.add(this,c);
1088
- },
1089
- removeClass: function(c){
1090
- jQuery.className.remove(this,c);
1091
- },
1092
- toggleClass: function( c ){
1093
- jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this,c);
1094
- },
1297
+ guid: 1,
1298
+ global: {},
1095
1299
 
1096
- remove: function(a){
1097
- if ( !a || jQuery.filter( a, [this] ).r )
1098
- this.parentNode.removeChild( this );
1099
- },
1100
- empty: function(){
1101
- while ( this.firstChild )
1102
- this.removeChild( this.firstChild );
1103
- },
1104
- bind: function( type, fn ) {
1105
- if ( fn.constructor == String )
1106
- fn = new Function("e", ( !fn.indexOf(".") ? "jQuery(this)" : "return " ) + fn);
1107
- jQuery.event.add( this, type, fn );
1108
- },
1300
+ // Detach an event or set of events from an element
1301
+ remove: function(element, type, handler) {
1302
+ var events = element.$events, ret, index;
1109
1303
 
1110
- unbind: function( type, fn ) {
1111
- jQuery.event.remove( this, type, fn );
1112
- },
1113
- trigger: function( type, data ) {
1114
- jQuery.event.trigger( type, data, this );
1304
+ if ( events ) {
1305
+ // type is actually an event object here
1306
+ if ( type && type.type ) {
1307
+ handler = type.handler;
1308
+ type = type.type;
1309
+ }
1310
+
1311
+ if ( !type ) {
1312
+ for ( type in events )
1313
+ this.remove( element, type );
1314
+
1315
+ } else if ( events[type] ) {
1316
+ // remove the given handler for the given type
1317
+ if ( handler )
1318
+ delete events[type][handler.guid];
1319
+
1320
+ // remove all handlers for the given type
1321
+ else
1322
+ for ( handler in element.$events[type] )
1323
+ delete events[type][handler];
1324
+
1325
+ // remove generic event handler if no more handlers exist
1326
+ for ( ret in events[type] ) break;
1327
+ if ( !ret ) {
1328
+ if (element.removeEventListener)
1329
+ element.removeEventListener(type, element.$handle, false);
1330
+ else
1331
+ element.detachEvent("on" + type, element.$handle);
1332
+ ret = null;
1333
+ delete events[type];
1334
+
1335
+ // Remove element from the global event type cache
1336
+ while ( this.global[type] && ( (index = jQuery.inArray(element, this.global[type])) >= 0 ) )
1337
+ delete this.global[type][index];
1338
+ }
1339
+ }
1340
+
1341
+ // Remove the expando if it's no longer used
1342
+ for ( ret in events ) break;
1343
+ if ( !ret )
1344
+ element.$handle = element.$events = null;
1345
+ }
1346
+ },
1347
+
1348
+ trigger: function(type, data, element) {
1349
+ // Clone the incoming data, if any
1350
+ data = jQuery.makeArray(data || []);
1351
+
1352
+ // Handle a global trigger
1353
+ if ( !element )
1354
+ jQuery.each( this.global[type] || [], function(){
1355
+ jQuery.event.trigger( type, data, this );
1356
+ });
1357
+
1358
+ // Handle triggering a single element
1359
+ else {
1360
+ var val, ret, fn = jQuery.isFunction( element[ type ] || null );
1361
+
1362
+ // Pass along a fake event
1363
+ data.unshift( this.fix({ type: type, target: element }) );
1364
+
1365
+ // Trigger the event
1366
+ if ( jQuery.isFunction(element.$handle) && (val = element.$handle.apply( element, data )) !== false )
1367
+ this.triggered = true;
1368
+
1369
+ if ( fn && val !== false && !jQuery.nodeName(element, 'a') )
1370
+ element[ type ]();
1371
+
1372
+ this.triggered = false;
1373
+ }
1374
+ },
1375
+
1376
+ handle: function(event) {
1377
+ // returned undefined or false
1378
+ var val;
1379
+
1380
+ // Empty object is for triggered events with no data
1381
+ event = jQuery.event.fix( event || window.event || {} );
1382
+
1383
+ var c = this.$events && this.$events[event.type], args = [].slice.call( arguments, 1 );
1384
+ args.unshift( event );
1385
+
1386
+ for ( var j in c ) {
1387
+ // Pass in a reference to the handler function itself
1388
+ // So that we can later remove it
1389
+ args[0].handler = c[j];
1390
+ args[0].data = c[j].data;
1391
+
1392
+ if ( c[j].apply( this, args ) === false ) {
1393
+ event.preventDefault();
1394
+ event.stopPropagation();
1395
+ val = false;
1396
+ }
1397
+ }
1398
+
1399
+ // Clean up added properties in IE to prevent memory leak
1400
+ if (jQuery.browser.msie)
1401
+ event.target = event.preventDefault = event.stopPropagation =
1402
+ event.handler = event.data = null;
1403
+
1404
+ return val;
1405
+ },
1406
+
1407
+ fix: function(event) {
1408
+ // store a copy of the original event object
1409
+ // and clone to set read-only properties
1410
+ var originalEvent = event;
1411
+ event = jQuery.extend({}, originalEvent);
1412
+
1413
+ // add preventDefault and stopPropagation since
1414
+ // they will not work on the clone
1415
+ event.preventDefault = function() {
1416
+ // if preventDefault exists run it on the original event
1417
+ if (originalEvent.preventDefault)
1418
+ return originalEvent.preventDefault();
1419
+ // otherwise set the returnValue property of the original event to false (IE)
1420
+ originalEvent.returnValue = false;
1421
+ };
1422
+ event.stopPropagation = function() {
1423
+ // if stopPropagation exists run it on the original event
1424
+ if (originalEvent.stopPropagation)
1425
+ return originalEvent.stopPropagation();
1426
+ // otherwise set the cancelBubble property of the original event to true (IE)
1427
+ originalEvent.cancelBubble = true;
1428
+ };
1429
+
1430
+ // Fix target property, if necessary
1431
+ if ( !event.target && event.srcElement )
1432
+ event.target = event.srcElement;
1433
+
1434
+ // check if target is a textnode (safari)
1435
+ if (jQuery.browser.safari && event.target.nodeType == 3)
1436
+ event.target = originalEvent.target.parentNode;
1437
+
1438
+ // Add relatedTarget, if necessary
1439
+ if ( !event.relatedTarget && event.fromElement )
1440
+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
1441
+
1442
+ // Calculate pageX/Y if missing and clientX/Y available
1443
+ if ( event.pageX == null && event.clientX != null ) {
1444
+ var e = document.documentElement, b = document.body;
1445
+ event.pageX = event.clientX + (e && e.scrollLeft || b.scrollLeft);
1446
+ event.pageY = event.clientY + (e && e.scrollTop || b.scrollTop);
1115
1447
  }
1448
+
1449
+ // Add which for key events
1450
+ if ( !event.which && (event.charCode || event.keyCode) )
1451
+ event.which = event.charCode || event.keyCode;
1452
+
1453
+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
1454
+ if ( !event.metaKey && event.ctrlKey )
1455
+ event.metaKey = event.ctrlKey;
1456
+
1457
+ // Add which for click: 1 == left; 2 == middle; 3 == right
1458
+ // Note: button is not normalized, so don't use it
1459
+ if ( !event.which && event.button )
1460
+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
1461
+
1462
+ return event;
1116
1463
  }
1117
1464
  };
1118
1465
 
1119
- jQuery.init();
1120
1466
  jQuery.fn.extend({
1467
+ bind: function( type, data, fn ) {
1468
+ return type == "unload" ? this.one(type, data, fn) : this.each(function(){
1469
+ jQuery.event.add( this, type, fn || data, fn && data );
1470
+ });
1471
+ },
1472
+ one: function( type, data, fn ) {
1473
+ return this.each(function(){
1474
+ jQuery.event.add( this, type, function(event) {
1475
+ jQuery(this).unbind(event);
1476
+ return (fn || data).apply( this, arguments);
1477
+ }, fn && data);
1478
+ });
1479
+ },
1480
+ unbind: function( type, fn ) {
1481
+ return this.each(function(){
1482
+ jQuery.event.remove( this, type, fn );
1483
+ });
1484
+ },
1485
+ trigger: function( type, data ) {
1486
+ return this.each(function(){
1487
+ jQuery.event.trigger( type, data, this );
1488
+ });
1489
+ },
1490
+ toggle: function() {
1491
+ // Save reference to arguments for access in closure
1492
+ var a = arguments;
1121
1493
 
1122
- // We're overriding the old toggle function, so
1123
- // remember it for later
1124
- _toggle: jQuery.fn.toggle,
1125
- toggle: function(a,b) {
1126
- // If two functions are passed in, we're
1127
- // toggling on a click
1128
- return a && b && a.constructor == Function && b.constructor == Function ? this.click(function(e){
1494
+ return this.click(function(e) {
1129
1495
  // Figure out which function to execute
1130
- this.last = this.last == a ? b : a;
1496
+ this.lastToggle = 0 == this.lastToggle ? 1 : 0;
1131
1497
 
1132
1498
  // Make sure that clicks stop
1133
1499
  e.preventDefault();
1134
1500
 
1135
1501
  // and execute the function
1136
- return this.last.apply( this, [e] ) || false;
1137
- }) :
1138
-
1139
- // Otherwise, execute the old toggle function
1140
- this._toggle.apply( this, arguments );
1502
+ return a[this.lastToggle].apply( this, [e] ) || false;
1503
+ });
1141
1504
  },
1142
1505
  hover: function(f,g) {
1143
1506
 
1144
- // A private function for haandling mouse 'hovering'
1507
+ // A private function for handling mouse 'hovering'
1145
1508
  function handleHover(e) {
1146
1509
  // Check if mouse(over|out) are still within the same parent element
1147
- var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
1510
+ var p = e.relatedTarget;
1148
1511
 
1149
1512
  // Traverse up the tree
1150
1513
  while ( p && p != this ) try { p = p.parentNode } catch(e) { p = this; };
@@ -1163,13 +1526,12 @@ jQuery.fn.extend({
1163
1526
  // If the DOM is already ready
1164
1527
  if ( jQuery.isReady )
1165
1528
  // Execute the function immediately
1166
- f.apply( document );
1529
+ f.apply( document, [jQuery] );
1167
1530
 
1168
1531
  // Otherwise, remember the function for later
1169
- else {
1532
+ else
1170
1533
  // Add the function to the wait list
1171
- jQuery.readyList.push( f );
1172
- }
1534
+ jQuery.readyList.push( function() { return f.apply(this, [jQuery]) } );
1173
1535
 
1174
1536
  return this;
1175
1537
  }
@@ -1192,67 +1554,45 @@ jQuery.extend({
1192
1554
  // If there are functions bound, to execute
1193
1555
  if ( jQuery.readyList ) {
1194
1556
  // Execute all of them
1195
- for ( var i = 0; i < jQuery.readyList.length; i++ )
1196
- jQuery.readyList[i].apply( document );
1557
+ jQuery.each( jQuery.readyList, function(){
1558
+ this.apply( document );
1559
+ });
1197
1560
 
1198
1561
  // Reset the list of functions
1199
1562
  jQuery.readyList = null;
1200
1563
  }
1201
- // Remove event lisenter to avoid memory leak
1564
+ // Remove event listener to avoid memory leak
1202
1565
  if ( jQuery.browser.mozilla || jQuery.browser.opera )
1203
1566
  document.removeEventListener( "DOMContentLoaded", jQuery.ready, false );
1567
+
1568
+ // Remove script element used by IE hack
1569
+ if( !window.frames.length ) // don't remove if frames are present (#1187)
1570
+ jQuery(window).load(function(){ jQuery("#__ie_init").remove(); });
1204
1571
  }
1205
1572
  }
1206
1573
  });
1207
1574
 
1208
1575
  new function(){
1209
1576
 
1210
- var e = ("blur,focus,load,resize,scroll,unload,click,dblclick," +
1211
- "mousedown,mouseup,mousemove,mouseover,mouseout,change,reset,select," +
1212
- "submit,keydown,keypress,keyup,error").split(",");
1213
-
1214
- // Go through all the event names, but make sure that
1215
- // it is enclosed properly
1216
- for ( var i = 0; i < e.length; i++ ) new function(){
1217
-
1218
- var o = e[i];
1577
+ jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
1578
+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
1579
+ "submit,keydown,keypress,keyup,error").split(","), function(i,o){
1219
1580
 
1220
1581
  // Handle event binding
1221
1582
  jQuery.fn[o] = function(f){
1222
1583
  return f ? this.bind(o, f) : this.trigger(o);
1223
1584
  };
1224
-
1225
- // Handle event unbinding
1226
- jQuery.fn["un"+o] = function(f){ return this.unbind(o, f); };
1227
-
1228
- // Finally, handle events that only fire once
1229
- jQuery.fn["one"+o] = function(f){
1230
- // Attach the event listener
1231
- return this.each(function(){
1232
-
1233
- var count = 0;
1234
-
1235
- // Add the event
1236
- jQuery.event.add( this, o, function(e){
1237
- // If this function has already been executed, stop
1238
- if ( count++ ) return;
1239
-
1240
- // And execute the bound function
1241
- return f.apply(this, [e]);
1242
- });
1243
- });
1244
- };
1245
1585
 
1246
- };
1586
+ });
1247
1587
 
1248
1588
  // If Mozilla is used
1249
- if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
1589
+ if ( jQuery.browser.mozilla || jQuery.browser.opera )
1250
1590
  // Use the handy event callback
1251
1591
  document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
1252
1592
 
1253
1593
  // If IE is used, use the excellent hack by Matthias Miller
1254
1594
  // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
1255
- } else if ( jQuery.browser.msie ) {
1595
+ else if ( jQuery.browser.msie ) {
1256
1596
 
1257
1597
  // Only works if you document.write() it
1258
1598
  document.write("<scr" + "ipt id=__ie_init defer=true " +
@@ -1260,17 +1600,19 @@ new function(){
1260
1600
 
1261
1601
  // Use the defer script hack
1262
1602
  var script = document.getElementById("__ie_init");
1263
- script.onreadystatechange = function() {
1264
- if ( this.readyState != "complete" ) return;
1265
- this.parentNode.removeChild( this );
1266
- jQuery.ready();
1267
- };
1603
+
1604
+ // script does not exist if jQuery is loaded dynamically
1605
+ if ( script )
1606
+ script.onreadystatechange = function() {
1607
+ if ( this.readyState != "complete" ) return;
1608
+ jQuery.ready();
1609
+ };
1268
1610
 
1269
1611
  // Clear from memory
1270
1612
  script = null;
1271
1613
 
1272
1614
  // If Safari is used
1273
- } else if ( jQuery.browser.safari ) {
1615
+ } else if ( jQuery.browser.safari )
1274
1616
  // Continually check to see if the document.readyState is valid
1275
1617
  jQuery.safariTimer = setInterval(function(){
1276
1618
  // loaded and complete are both valid states
@@ -1284,8 +1626,7 @@ new function(){
1284
1626
  // and execute any waiting functions
1285
1627
  jQuery.ready();
1286
1628
  }
1287
- }, 10);
1288
- }
1629
+ }, 10);
1289
1630
 
1290
1631
  // A fallback to window.onload, that will always work
1291
1632
  jQuery.event.add( window, "load", jQuery.ready );
@@ -1293,72 +1634,483 @@ new function(){
1293
1634
  };
1294
1635
 
1295
1636
  // Clean up after IE to avoid memory leaks
1296
- if (jQuery.browser.msie) jQuery(window).unload(function() {
1297
- var event = jQuery.event, global = event.global;
1298
- for (var type in global) {
1299
- var els = global[type], i = els.length;
1300
- if (i>0) do if (type != 'unload') event.remove(els[i-1], type); while (--i);
1637
+ if (jQuery.browser.msie)
1638
+ jQuery(window).one("unload", function() {
1639
+ var global = jQuery.event.global;
1640
+ for ( var type in global ) {
1641
+ var els = global[type], i = els.length;
1642
+ if ( i && type != 'unload' )
1643
+ do
1644
+ els[i-1] && jQuery.event.remove(els[i-1], type);
1645
+ while (--i);
1646
+ }
1647
+ });
1648
+ jQuery.fn.extend({
1649
+ loadIfModified: function( url, params, callback ) {
1650
+ this.load( url, params, callback, 1 );
1651
+ },
1652
+ load: function( url, params, callback, ifModified ) {
1653
+ if ( jQuery.isFunction( url ) )
1654
+ return this.bind("load", url);
1655
+
1656
+ callback = callback || function(){};
1657
+
1658
+ // Default to a GET request
1659
+ var type = "GET";
1660
+
1661
+ // If the second parameter was provided
1662
+ if ( params )
1663
+ // If it's a function
1664
+ if ( jQuery.isFunction( params ) ) {
1665
+ // We assume that it's the callback
1666
+ callback = params;
1667
+ params = null;
1668
+
1669
+ // Otherwise, build a param string
1670
+ } else {
1671
+ params = jQuery.param( params );
1672
+ type = "POST";
1673
+ }
1674
+
1675
+ var self = this;
1676
+
1677
+ // Request the remote document
1678
+ jQuery.ajax({
1679
+ url: url,
1680
+ type: type,
1681
+ data: params,
1682
+ ifModified: ifModified,
1683
+ complete: function(res, status){
1684
+ if ( status == "success" || !ifModified && status == "notmodified" )
1685
+ // Inject the HTML into all the matched elements
1686
+ self.attr("innerHTML", res.responseText)
1687
+ // Execute all the scripts inside of the newly-injected HTML
1688
+ .evalScripts()
1689
+ // Execute callback
1690
+ .each( callback, [res.responseText, status, res] );
1691
+ else
1692
+ callback.apply( self, [res.responseText, status, res] );
1693
+ }
1694
+ });
1695
+ return this;
1696
+ },
1697
+ serialize: function() {
1698
+ return jQuery.param( this );
1699
+ },
1700
+ evalScripts: function() {
1701
+ return this.find("script").each(function(){
1702
+ if ( this.src )
1703
+ jQuery.getScript( this.src );
1704
+ else
1705
+ jQuery.globalEval( this.text || this.textContent || this.innerHTML || "" );
1706
+ }).end();
1301
1707
  }
1708
+
1302
1709
  });
1303
- jQuery.fn.extend({
1304
1710
 
1305
- // overwrite the old show method
1306
- _show: jQuery.fn.show,
1711
+ // Attach a bunch of functions for handling common AJAX events
1307
1712
 
1308
- show: function(speed,callback){
1309
- return speed ? this.animate({
1310
- height: "show", width: "show", opacity: "show"
1311
- }, speed, callback) : this._show();
1713
+ jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
1714
+ jQuery.fn[o] = function(f){
1715
+ return this.bind(o, f);
1716
+ };
1717
+ });
1718
+
1719
+ jQuery.extend({
1720
+ get: function( url, data, callback, type, ifModified ) {
1721
+ // shift arguments if data argument was ommited
1722
+ if ( jQuery.isFunction( data ) ) {
1723
+ callback = data;
1724
+ data = null;
1725
+ }
1726
+
1727
+ return jQuery.ajax({
1728
+ type: "GET",
1729
+ url: url,
1730
+ data: data,
1731
+ success: callback,
1732
+ dataType: type,
1733
+ ifModified: ifModified
1734
+ });
1735
+ },
1736
+ getIfModified: function( url, data, callback, type ) {
1737
+ return jQuery.get(url, data, callback, type, 1);
1738
+ },
1739
+ getScript: function( url, callback ) {
1740
+ return jQuery.get(url, null, callback, "script");
1741
+ },
1742
+ getJSON: function( url, data, callback ) {
1743
+ return jQuery.get(url, data, callback, "json");
1744
+ },
1745
+ post: function( url, data, callback, type ) {
1746
+ if ( jQuery.isFunction( data ) ) {
1747
+ callback = data;
1748
+ data = {};
1749
+ }
1750
+
1751
+ return jQuery.ajax({
1752
+ type: "POST",
1753
+ url: url,
1754
+ data: data,
1755
+ success: callback,
1756
+ dataType: type
1757
+ });
1758
+ },
1759
+ ajaxTimeout: function( timeout ) {
1760
+ jQuery.ajaxSettings.timeout = timeout;
1761
+ },
1762
+ ajaxSetup: function( settings ) {
1763
+ jQuery.extend( jQuery.ajaxSettings, settings );
1764
+ },
1765
+
1766
+ ajaxSettings: {
1767
+ global: true,
1768
+ type: "GET",
1769
+ timeout: 0,
1770
+ contentType: "application/x-www-form-urlencoded",
1771
+ processData: true,
1772
+ async: true,
1773
+ data: null
1774
+ },
1775
+
1776
+ // Last-Modified header cache for next request
1777
+ lastModified: {},
1778
+ ajax: function( s ) {
1779
+ // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout
1780
+ s = jQuery.extend({}, jQuery.ajaxSettings, s);
1781
+
1782
+ // if data available
1783
+ if ( s.data ) {
1784
+ // convert data if not already a string
1785
+ if (s.processData && typeof s.data != "string")
1786
+ s.data = jQuery.param(s.data);
1787
+ // append data to url for get requests
1788
+ if( s.type.toLowerCase() == "get" ) {
1789
+ // "?" + data or "&" + data (in case there are already params)
1790
+ s.url += ((s.url.indexOf("?") > -1) ? "&" : "?") + s.data;
1791
+ // IE likes to send both get and post data, prevent this
1792
+ s.data = null;
1793
+ }
1794
+ }
1795
+
1796
+ // Watch for a new set of requests
1797
+ if ( s.global && ! jQuery.active++ )
1798
+ jQuery.event.trigger( "ajaxStart" );
1799
+
1800
+ var requestDone = false;
1801
+
1802
+ // Create the request object; Microsoft failed to properly
1803
+ // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
1804
+ var xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
1805
+
1806
+ // Open the socket
1807
+ xml.open(s.type, s.url, s.async);
1808
+
1809
+ // Set the correct header, if data is being sent
1810
+ if ( s.data )
1811
+ xml.setRequestHeader("Content-Type", s.contentType);
1812
+
1813
+ // Set the If-Modified-Since header, if ifModified mode.
1814
+ if ( s.ifModified )
1815
+ xml.setRequestHeader("If-Modified-Since",
1816
+ jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
1817
+
1818
+ // Set header so the called script knows that it's an XMLHttpRequest
1819
+ xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
1820
+
1821
+ // Allow custom headers/mimetypes
1822
+ if( s.beforeSend )
1823
+ s.beforeSend(xml);
1824
+
1825
+ if ( s.global )
1826
+ jQuery.event.trigger("ajaxSend", [xml, s]);
1827
+
1828
+ // Wait for a response to come back
1829
+ var onreadystatechange = function(isTimeout){
1830
+ // The transfer is complete and the data is available, or the request timed out
1831
+ if ( xml && (xml.readyState == 4 || isTimeout == "timeout") ) {
1832
+ requestDone = true;
1833
+
1834
+ // clear poll interval
1835
+ if (ival) {
1836
+ clearInterval(ival);
1837
+ ival = null;
1838
+ }
1839
+
1840
+ var status;
1841
+ try {
1842
+ status = jQuery.httpSuccess( xml ) && isTimeout != "timeout" ?
1843
+ s.ifModified && jQuery.httpNotModified( xml, s.url ) ? "notmodified" : "success" : "error";
1844
+ // Make sure that the request was successful or notmodified
1845
+ if ( status != "error" ) {
1846
+ // Cache Last-Modified header, if ifModified mode.
1847
+ var modRes;
1848
+ try {
1849
+ modRes = xml.getResponseHeader("Last-Modified");
1850
+ } catch(e) {} // swallow exception thrown by FF if header is not available
1851
+
1852
+ if ( s.ifModified && modRes )
1853
+ jQuery.lastModified[s.url] = modRes;
1854
+
1855
+ // process the data (runs the xml through httpData regardless of callback)
1856
+ var data = jQuery.httpData( xml, s.dataType );
1857
+
1858
+ // If a local callback was specified, fire it and pass it the data
1859
+ if ( s.success )
1860
+ s.success( data, status );
1861
+
1862
+ // Fire the global callback
1863
+ if( s.global )
1864
+ jQuery.event.trigger( "ajaxSuccess", [xml, s] );
1865
+ } else
1866
+ jQuery.handleError(s, xml, status);
1867
+ } catch(e) {
1868
+ status = "error";
1869
+ jQuery.handleError(s, xml, status, e);
1870
+ }
1871
+
1872
+ // The request was completed
1873
+ if( s.global )
1874
+ jQuery.event.trigger( "ajaxComplete", [xml, s] );
1875
+
1876
+ // Handle the global AJAX counter
1877
+ if ( s.global && ! --jQuery.active )
1878
+ jQuery.event.trigger( "ajaxStop" );
1879
+
1880
+ // Process result
1881
+ if ( s.complete )
1882
+ s.complete(xml, status);
1883
+
1884
+ // Stop memory leaks
1885
+ if(s.async)
1886
+ xml = null;
1887
+ }
1888
+ };
1889
+
1890
+ // don't attach the handler to the request, just poll it instead
1891
+ var ival = setInterval(onreadystatechange, 13);
1892
+
1893
+ // Timeout checker
1894
+ if ( s.timeout > 0 )
1895
+ setTimeout(function(){
1896
+ // Check to see if the request is still happening
1897
+ if ( xml ) {
1898
+ // Cancel the request
1899
+ xml.abort();
1900
+
1901
+ if( !requestDone )
1902
+ onreadystatechange( "timeout" );
1903
+ }
1904
+ }, s.timeout);
1905
+
1906
+ // Send the data
1907
+ try {
1908
+ xml.send(s.data);
1909
+ } catch(e) {
1910
+ jQuery.handleError(s, xml, null, e);
1911
+ }
1912
+
1913
+ // firefox 1.5 doesn't fire statechange for sync requests
1914
+ if ( !s.async )
1915
+ onreadystatechange();
1916
+
1917
+ // return XMLHttpRequest to allow aborting the request etc.
1918
+ return xml;
1919
+ },
1920
+
1921
+ handleError: function( s, xml, status, e ) {
1922
+ // If a local callback was specified, fire it
1923
+ if ( s.error ) s.error( xml, status, e );
1924
+
1925
+ // Fire the global callback
1926
+ if ( s.global )
1927
+ jQuery.event.trigger( "ajaxError", [xml, s, e] );
1928
+ },
1929
+
1930
+ // Counter for holding the number of active queries
1931
+ active: 0,
1932
+
1933
+ // Determines if an XMLHttpRequest was successful or not
1934
+ httpSuccess: function( r ) {
1935
+ try {
1936
+ return !r.status && location.protocol == "file:" ||
1937
+ ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
1938
+ jQuery.browser.safari && r.status == undefined;
1939
+ } catch(e){}
1940
+ return false;
1941
+ },
1942
+
1943
+ // Determines if an XMLHttpRequest returns NotModified
1944
+ httpNotModified: function( xml, url ) {
1945
+ try {
1946
+ var xmlRes = xml.getResponseHeader("Last-Modified");
1947
+
1948
+ // Firefox always returns 200. check Last-Modified date
1949
+ return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
1950
+ jQuery.browser.safari && xml.status == undefined;
1951
+ } catch(e){}
1952
+ return false;
1953
+ },
1954
+
1955
+ /* Get the data out of an XMLHttpRequest.
1956
+ * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
1957
+ * otherwise return plain text.
1958
+ * (String) data - The type of data that you're expecting back,
1959
+ * (e.g. "xml", "html", "script")
1960
+ */
1961
+ httpData: function( r, type ) {
1962
+ var ct = r.getResponseHeader("content-type");
1963
+ var data = !type && ct && ct.indexOf("xml") >= 0;
1964
+ data = type == "xml" || data ? r.responseXML : r.responseText;
1965
+
1966
+ // If the type is "script", eval it in global context
1967
+ if ( type == "script" )
1968
+ jQuery.globalEval( data );
1969
+
1970
+ // Get the JavaScript object, if JSON is used.
1971
+ if ( type == "json" )
1972
+ data = eval("(" + data + ")");
1973
+
1974
+ // evaluate scripts within html
1975
+ if ( type == "html" )
1976
+ jQuery("<div>").html(data).evalScripts();
1977
+
1978
+ return data;
1979
+ },
1980
+
1981
+ // Serialize an array of form elements or a set of
1982
+ // key/values into a query string
1983
+ param: function( a ) {
1984
+ var s = [];
1985
+
1986
+ // If an array was passed in, assume that it is an array
1987
+ // of form elements
1988
+ if ( a.constructor == Array || a.jquery )
1989
+ // Serialize the form elements
1990
+ jQuery.each( a, function(){
1991
+ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
1992
+ });
1993
+
1994
+ // Otherwise, assume that it's an object of key/value pairs
1995
+ else
1996
+ // Serialize the key/values
1997
+ for ( var j in a )
1998
+ // If the value is an array then the key names need to be repeated
1999
+ if ( a[j] && a[j].constructor == Array )
2000
+ jQuery.each( a[j], function(){
2001
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
2002
+ });
2003
+ else
2004
+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );
2005
+
2006
+ // Return the resulting serialization
2007
+ return s.join("&");
1312
2008
  },
1313
2009
 
1314
- // Overwrite the old hide method
1315
- _hide: jQuery.fn.hide,
2010
+ // evalulates a script in global context
2011
+ // not reliable for safari
2012
+ globalEval: function( data ) {
2013
+ if ( window.execScript )
2014
+ window.execScript( data );
2015
+ else if ( jQuery.browser.safari )
2016
+ // safari doesn't provide a synchronous global eval
2017
+ window.setTimeout( data, 0 );
2018
+ else
2019
+ eval.call( window, data );
2020
+ }
2021
+
2022
+ });
2023
+ jQuery.fn.extend({
2024
+
2025
+ show: function(speed,callback){
2026
+ return speed ?
2027
+ this.animate({
2028
+ height: "show", width: "show", opacity: "show"
2029
+ }, speed, callback) :
2030
+
2031
+ this.filter(":hidden").each(function(){
2032
+ this.style.display = this.oldblock ? this.oldblock : "";
2033
+ if ( jQuery.css(this,"display") == "none" )
2034
+ this.style.display = "block";
2035
+ }).end();
2036
+ },
1316
2037
 
1317
2038
  hide: function(speed,callback){
1318
- return speed ? this.animate({
1319
- height: "hide", width: "hide", opacity: "hide"
1320
- }, speed, callback) : this._hide();
2039
+ return speed ?
2040
+ this.animate({
2041
+ height: "hide", width: "hide", opacity: "hide"
2042
+ }, speed, callback) :
2043
+
2044
+ this.filter(":visible").each(function(){
2045
+ this.oldblock = this.oldblock || jQuery.css(this,"display");
2046
+ if ( this.oldblock == "none" )
2047
+ this.oldblock = "block";
2048
+ this.style.display = "none";
2049
+ }).end();
1321
2050
  },
1322
2051
 
2052
+ // Save the old toggle function
2053
+ _toggle: jQuery.fn.toggle,
2054
+ toggle: function( fn, fn2 ){
2055
+ return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
2056
+ this._toggle( fn, fn2 ) :
2057
+ fn ?
2058
+ this.animate({
2059
+ height: "toggle", width: "toggle", opacity: "toggle"
2060
+ }, fn, fn2) :
2061
+ this.each(function(){
2062
+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
2063
+ });
2064
+ },
1323
2065
  slideDown: function(speed,callback){
1324
2066
  return this.animate({height: "show"}, speed, callback);
1325
2067
  },
1326
-
1327
2068
  slideUp: function(speed,callback){
1328
2069
  return this.animate({height: "hide"}, speed, callback);
1329
2070
  },
1330
-
1331
- slideToggle: function(speed,callback){
1332
- return this.each(function(){
1333
- var state = jQuery(this).is(":hidden") ? "show" : "hide";
1334
- jQuery(this).animate({height: state}, speed, callback);
1335
- });
2071
+ slideToggle: function(speed, callback){
2072
+ return this.animate({height: "toggle"}, speed, callback);
1336
2073
  },
1337
-
1338
- fadeIn: function(speed,callback){
2074
+ fadeIn: function(speed, callback){
1339
2075
  return this.animate({opacity: "show"}, speed, callback);
1340
2076
  },
1341
-
1342
- fadeOut: function(speed,callback){
2077
+ fadeOut: function(speed, callback){
1343
2078
  return this.animate({opacity: "hide"}, speed, callback);
1344
2079
  },
1345
-
1346
2080
  fadeTo: function(speed,to,callback){
1347
2081
  return this.animate({opacity: to}, speed, callback);
1348
2082
  },
1349
- animate: function(prop,speed,callback) {
2083
+ animate: function( prop, speed, easing, callback ) {
1350
2084
  return this.queue(function(){
1351
-
1352
- this.curAnim = prop;
2085
+ var hidden = jQuery(this).is(":hidden"),
2086
+ opt = jQuery.speed(speed, easing, callback),
2087
+ self = this;
1353
2088
 
1354
2089
  for ( var p in prop ) {
1355
- var e = new jQuery.fx( this, jQuery.speed(speed,callback), p );
1356
- if ( prop[p].constructor == Number )
1357
- e.custom( e.cur(), prop[p] );
1358
- else
1359
- e[ prop[p] ]( prop );
2090
+ if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
2091
+ return jQuery.isFunction(opt.complete) && opt.complete.apply(this);
2092
+
2093
+ if ( p == "height" || p == "width" ) {
2094
+ // Store display property
2095
+ opt.display = jQuery.css(this, "display");
2096
+
2097
+ // Make sure that nothing sneaks out
2098
+ opt.overflow = this.style.overflow;
2099
+ }
1360
2100
  }
2101
+
2102
+ if ( opt.overflow != null )
2103
+ this.style.overflow = "hidden";
2104
+
2105
+ this.curAnim = jQuery.extend({}, prop);
1361
2106
 
2107
+ jQuery.each( prop, function(name, val){
2108
+ var e = new jQuery.fx( self, opt, name );
2109
+ if ( val.constructor == Number )
2110
+ e.custom( e.cur(), val );
2111
+ else
2112
+ e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
2113
+ });
1362
2114
  });
1363
2115
  },
1364
2116
  queue: function(type,fn){
@@ -1384,53 +2136,37 @@ jQuery.fn.extend({
1384
2136
  });
1385
2137
 
1386
2138
  jQuery.extend({
1387
-
1388
- setAuto: function(e,p) {
1389
- if ( e.notAuto ) return;
1390
-
1391
- if ( p == "height" && e.scrollHeight != parseInt(jQuery.curCSS(e,p)) ) return;
1392
- if ( p == "width" && e.scrollWidth != parseInt(jQuery.curCSS(e,p)) ) return;
1393
-
1394
- // Remember the original height
1395
- var a = e.style[p];
1396
-
1397
- // Figure out the size of the height right now
1398
- var o = jQuery.curCSS(e,p,1);
1399
-
1400
- if ( p == "height" && e.scrollHeight != o ||
1401
- p == "width" && e.scrollWidth != o ) return;
1402
-
1403
- // Set the height to auto
1404
- e.style[p] = e.currentStyle ? "" : "auto";
1405
-
1406
- // See what the size of "auto" is
1407
- var n = jQuery.curCSS(e,p,1);
1408
-
1409
- // Revert back to the original size
1410
- if ( o != n && n != "auto" ) {
1411
- e.style[p] = a;
1412
- e.notAuto = true;
1413
- }
1414
- },
1415
2139
 
1416
- speed: function(s,o) {
1417
- o = o || {};
1418
-
1419
- if ( o.constructor == Function )
1420
- o = { complete: o };
1421
-
1422
- var ss = { slow: 600, fast: 200 };
1423
- o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
2140
+ speed: function(speed, easing, fn) {
2141
+ var opt = speed && speed.constructor == Object ? speed : {
2142
+ complete: fn || !fn && easing ||
2143
+ jQuery.isFunction( speed ) && speed,
2144
+ duration: speed,
2145
+ easing: fn && easing || easing && easing.constructor != Function && easing || (jQuery.easing.swing ? "swing" : "linear")
2146
+ };
2147
+
2148
+ opt.duration = (opt.duration && opt.duration.constructor == Number ?
2149
+ opt.duration :
2150
+ { slow: 600, fast: 200 }[opt.duration]) || 400;
1424
2151
 
1425
2152
  // Queueing
1426
- o.oldComplete = o.complete;
1427
- o.complete = function(){
2153
+ opt.old = opt.complete;
2154
+ opt.complete = function(){
1428
2155
  jQuery.dequeue(this, "fx");
1429
- if ( o.oldComplete && o.oldComplete.constructor == Function )
1430
- o.oldComplete.apply( this );
2156
+ if ( jQuery.isFunction( opt.old ) )
2157
+ opt.old.apply( this );
1431
2158
  };
1432
2159
 
1433
- return o;
2160
+ return opt;
2161
+ },
2162
+
2163
+ easing: {
2164
+ linear: function( p, n, firstNum, diff ) {
2165
+ return firstNum + diff * p;
2166
+ },
2167
+ swing: function( p, n, firstNum, diff ) {
2168
+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
2169
+ }
1434
2170
  },
1435
2171
 
1436
2172
  queue: {},
@@ -1449,6 +2185,8 @@ jQuery.extend({
1449
2185
  }
1450
2186
  },
1451
2187
 
2188
+ timers: [],
2189
+
1452
2190
  /*
1453
2191
  * I originally wrote fx() as a clone of moo.fx and in the process
1454
2192
  * of making it small in size the code became illegible to sane
@@ -1456,468 +2194,151 @@ jQuery.extend({
1456
2194
  */
1457
2195
 
1458
2196
  fx: function( elem, options, prop ){
1459
-
2197
+
1460
2198
  var z = this;
1461
-
1462
- // The users options
1463
- z.o = {
1464
- duration: options.duration || 400,
1465
- complete: options.complete,
1466
- step: options.step
1467
- };
1468
-
1469
- // The element
1470
- z.el = elem;
1471
-
2199
+
1472
2200
  // The styles
1473
- var y = z.el.style;
1474
-
2201
+ var y = elem.style;
2202
+
1475
2203
  // Simple function for setting a style value
1476
2204
  z.a = function(){
1477
2205
  if ( options.step )
1478
2206
  options.step.apply( elem, [ z.now ] );
1479
-
2207
+
1480
2208
  if ( prop == "opacity" )
1481
2209
  jQuery.attr(y, "opacity", z.now); // Let attr handle opacity
1482
- else if ( parseInt(z.now) ) // My hate for IE will never die
2210
+ else {
1483
2211
  y[prop] = parseInt(z.now) + "px";
1484
-
1485
- y.display = "block";
2212
+ y.display = "block"; // Set display property to block for animation
2213
+ }
1486
2214
  };
1487
-
2215
+
1488
2216
  // Figure out the maximum number to run to
1489
2217
  z.max = function(){
1490
- return parseFloat( jQuery.css(z.el,prop) );
2218
+ return parseFloat( jQuery.css(elem,prop) );
1491
2219
  };
1492
-
2220
+
1493
2221
  // Get the current size
1494
2222
  z.cur = function(){
1495
- var r = parseFloat( jQuery.curCSS(z.el, prop) );
2223
+ var r = parseFloat( jQuery.curCSS(elem, prop) );
1496
2224
  return r && r > -10000 ? r : z.max();
1497
2225
  };
1498
-
2226
+
1499
2227
  // Start an animation from one number to another
1500
2228
  z.custom = function(from,to){
1501
2229
  z.startTime = (new Date()).getTime();
1502
2230
  z.now = from;
1503
2231
  z.a();
1504
-
1505
- z.timer = setInterval(function(){
1506
- z.step(from, to);
1507
- }, 13);
2232
+
2233
+ jQuery.timers.push(function(){
2234
+ return z.step(from, to);
2235
+ });
2236
+
2237
+ if ( jQuery.timers.length == 1 ) {
2238
+ var timer = setInterval(function(){
2239
+ var timers = jQuery.timers;
2240
+
2241
+ for ( var i = 0; i < timers.length; i++ )
2242
+ if ( !timers[i]() )
2243
+ timers.splice(i--, 1);
2244
+
2245
+ if ( !timers.length )
2246
+ clearInterval( timer );
2247
+ }, 13);
2248
+ }
1508
2249
  };
1509
-
2250
+
1510
2251
  // Simple 'show' function
1511
- z.show = function( p ){
1512
- if ( !z.el.orig ) z.el.orig = {};
2252
+ z.show = function(){
2253
+ if ( !elem.orig ) elem.orig = {};
1513
2254
 
1514
2255
  // Remember where we started, so that we can go back to it later
1515
- z.el.orig[prop] = this.cur();
1516
-
2256
+ elem.orig[prop] = jQuery.attr( elem.style, prop );
2257
+
2258
+ options.show = true;
2259
+
1517
2260
  // Begin the animation
1518
- if (prop == "opacity")
1519
- z.custom(z.el.orig[prop], 1);
1520
- else
1521
- z.custom(0, z.el.orig[prop]);
2261
+ z.custom(0, this.cur());
1522
2262
 
1523
- // Stupid IE, look what you made me do
2263
+ // Make sure that we start at a small width/height to avoid any
2264
+ // flash of content
1524
2265
  if ( prop != "opacity" )
1525
2266
  y[prop] = "1px";
2267
+
2268
+ // Start by showing the element
2269
+ jQuery(elem).show();
1526
2270
  };
1527
-
2271
+
1528
2272
  // Simple 'hide' function
1529
2273
  z.hide = function(){
1530
- if ( !z.el.orig ) z.el.orig = {};
2274
+ if ( !elem.orig ) elem.orig = {};
1531
2275
 
1532
2276
  // Remember where we started, so that we can go back to it later
1533
- z.el.orig[prop] = this.cur();
2277
+ elem.orig[prop] = jQuery.attr( elem.style, prop );
1534
2278
 
1535
- z.o.hide = true;
2279
+ options.hide = true;
1536
2280
 
1537
2281
  // Begin the animation
1538
- z.custom(z.el.orig[prop], 0);
2282
+ z.custom(this.cur(), 0);
1539
2283
  };
1540
-
1541
- // Remember the overflow of the element
1542
- if ( !z.el.oldOverlay )
1543
- z.el.oldOverflow = jQuery.css( z.el, "overflow" );
1544
-
1545
- // Make sure that nothing sneaks out
1546
- y.overflow = "hidden";
1547
-
2284
+
1548
2285
  // Each step of an animation
1549
2286
  z.step = function(firstNum, lastNum){
1550
2287
  var t = (new Date()).getTime();
1551
-
1552
- if (t > z.o.duration + z.startTime) {
1553
- // Stop the timer
1554
- clearInterval(z.timer);
1555
- z.timer = null;
1556
2288
 
2289
+ if (t > options.duration + z.startTime) {
1557
2290
  z.now = lastNum;
1558
2291
  z.a();
1559
2292
 
1560
- z.el.curAnim[ prop ] = true;
1561
-
2293
+ if (elem.curAnim) elem.curAnim[ prop ] = true;
2294
+
1562
2295
  var done = true;
1563
- for ( var i in z.el.curAnim )
1564
- if ( z.el.curAnim[i] !== true )
2296
+ for ( var i in elem.curAnim )
2297
+ if ( elem.curAnim[i] !== true )
1565
2298
  done = false;
1566
-
2299
+
1567
2300
  if ( done ) {
1568
- // Reset the overflow
1569
- y.overflow = z.el.oldOverflow;
1570
-
1571
- // Hide the element if the "hide" operation was done
1572
- if ( z.o.hide )
1573
- y.display = 'none';
2301
+ if ( options.display != null ) {
2302
+ // Reset the overflow
2303
+ y.overflow = options.overflow;
1574
2304
 
1575
- // Reset the property, if the item has been hidden
1576
- if ( z.o.hide ) {
1577
- for ( var p in z.el.curAnim ) {
1578
- if (p == "opacity" && jQuery.browser.msie)
1579
- jQuery.attr(y, p, z.el.orig[p]);
1580
- else
1581
- y[ p ] = z.el.orig[p] + "px";
1582
-
1583
- // set its height and/or width to auto
1584
- if ( p == 'height' || p == 'width' )
1585
- jQuery.setAuto( z.el, p );
1586
- }
2305
+ // Reset the display
2306
+ y.display = options.display;
2307
+ if ( jQuery.css(elem, "display") == "none" )
2308
+ y.display = "block";
1587
2309
  }
2310
+
2311
+ // Hide the element if the "hide" operation was done
2312
+ if ( options.hide )
2313
+ y.display = "none";
2314
+
2315
+ // Reset the properties, if the item has been hidden or shown
2316
+ if ( options.hide || options.show )
2317
+ for ( var p in elem.curAnim )
2318
+ jQuery.attr(y, p, elem.orig[p]);
1588
2319
  }
1589
2320
 
1590
2321
  // If a callback was provided, execute it
1591
- if( done && z.o.complete && z.o.complete.constructor == Function )
2322
+ if ( done && jQuery.isFunction( options.complete ) )
1592
2323
  // Execute the complete function
1593
- z.o.complete.apply( z.el );
2324
+ options.complete.apply( elem );
2325
+
2326
+ return false;
1594
2327
  } else {
2328
+ var n = t - this.startTime;
1595
2329
  // Figure out where in the animation we are and set the number
1596
- var p = (t - this.startTime) / z.o.duration;
1597
- z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
1598
-
2330
+ var p = n / options.duration;
2331
+
2332
+ // Perform the easing function, defaults to swing
2333
+ z.now = jQuery.easing[options.easing](p, n, firstNum, (lastNum-firstNum), options.duration);
2334
+
1599
2335
  // Perform the next step of the animation
1600
2336
  z.a();
1601
2337
  }
1602
- };
1603
-
1604
- }
1605
-
1606
- });
1607
- jQuery.fn.extend({
1608
- loadIfModified: function( url, params, callback ) {
1609
- this.load( url, params, callback, 1 );
1610
- },
1611
- load: function( url, params, callback, ifModified ) {
1612
- if ( url.constructor == Function )
1613
- return this.bind("load", url);
1614
-
1615
- callback = callback || function(){};
1616
-
1617
- // Default to a GET request
1618
- var type = "GET";
1619
-
1620
- // If the second parameter was provided
1621
- if ( params ) {
1622
- // If it's a function
1623
- if ( params.constructor == Function ) {
1624
- // We assume that it's the callback
1625
- callback = params;
1626
- params = null;
1627
-
1628
- // Otherwise, build a param string
1629
- } else {
1630
- params = jQuery.param( params );
1631
- type = "POST";
1632
- }
1633
- }
1634
-
1635
- var self = this;
1636
-
1637
- // Request the remote document
1638
- jQuery.ajax( type, url, params,function(res, status){
1639
-
1640
- if ( status == "success" || !ifModified && status == "notmodified" ) {
1641
- // Inject the HTML into all the matched elements
1642
- self.html(res.responseText).each( callback, [res.responseText, status] );
1643
-
1644
- // Execute all the scripts inside of the newly-injected HTML
1645
- jQuery("script", self).each(function(){
1646
- if ( this.src )
1647
- jQuery.getScript( this.src );
1648
- else
1649
- eval.call( window, this.text || this.textContent || this.innerHTML || "" );
1650
- });
1651
- } else
1652
- callback.apply( self, [res.responseText, status] );
1653
-
1654
- }, ifModified);
1655
-
1656
- return this;
1657
- },
1658
- serialize: function() {
1659
- return jQuery.param( this );
1660
- }
1661
-
1662
- });
1663
-
1664
- // If IE is used, create a wrapper for the XMLHttpRequest object
1665
- if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" )
1666
- XMLHttpRequest = function(){
1667
- return new ActiveXObject(
1668
- navigator.userAgent.indexOf("MSIE 5") >= 0 ?
1669
- "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
1670
- );
1671
- };
1672
-
1673
- // Attach a bunch of functions for handling common AJAX events
1674
-
1675
-
1676
-
1677
- new function(){
1678
- var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(",");
1679
-
1680
- for ( var i = 0; i < e.length; i++ ) new function(){
1681
- var o = e[i];
1682
- jQuery.fn[o] = function(f){
1683
- return this.bind(o, f);
1684
- };
1685
- };
1686
- };
1687
-
1688
- jQuery.extend({
1689
- get: function( url, data, callback, type, ifModified ) {
1690
- if ( data.constructor == Function ) {
1691
- type = callback;
1692
- callback = data;
1693
- data = null;
1694
- }
1695
-
1696
- // append ? + data or & + data, in case there are already params
1697
- if ( data ) url += ((url.indexOf("?") > -1) ? "&" : "?") + jQuery.param(data);
1698
-
1699
- // Build and start the HTTP Request
1700
- jQuery.ajax( "GET", url, null, function(r, status) {
1701
- if ( callback ) callback( jQuery.httpData(r,type), status );
1702
- }, ifModified);
1703
- },
1704
- getIfModified: function( url, data, callback, type ) {
1705
- jQuery.get(url, data, callback, type, 1);
1706
- },
1707
- getScript: function( url, callback ) {
1708
- jQuery.get(url, callback, "script");
1709
- },
1710
- getJSON: function( url, data, callback ) {
1711
- if(callback)
1712
- jQuery.get(url, data, callback, "json");
1713
- else {
1714
- jQuery.get(url, data, "json");
1715
- }
1716
- },
1717
- post: function( url, data, callback, type ) {
1718
- // Build and start the HTTP Request
1719
- jQuery.ajax( "POST", url, jQuery.param(data), function(r, status) {
1720
- if ( callback ) callback( jQuery.httpData(r,type), status );
1721
- });
1722
- },
1723
-
1724
- // timeout (ms)
1725
- timeout: 0,
1726
- ajaxTimeout: function(timeout) {
1727
- jQuery.timeout = timeout;
1728
- },
1729
-
1730
- // Last-Modified header cache for next request
1731
- lastModified: {},
1732
- ajax: function( type, url, data, ret, ifModified ) {
1733
- // If only a single argument was passed in,
1734
- // assume that it is a object of key/value pairs
1735
- if ( !url ) {
1736
- ret = type.complete;
1737
- var success = type.success;
1738
- var error = type.error;
1739
- var dataType = type.dataType;
1740
- var global = typeof type.global == "boolean" ? type.global : true;
1741
- var timeout = typeof type.timeout == "number" ? type.timeout : jQuery.timeout;
1742
- var ifModified = type.ifModified || false;
1743
- data = type.data;
1744
- url = type.url;
1745
- type = type.type;
1746
- }
1747
-
1748
- // Watch for a new set of requests
1749
- if ( global && ! jQuery.active++ )
1750
- jQuery.event.trigger( "ajaxStart" );
1751
-
1752
- var requestDone = false;
1753
-
1754
- // Create the request object
1755
- var xml = new XMLHttpRequest();
1756
-
1757
- // Open the socket
1758
- xml.open(type || "GET", url, true);
1759
-
1760
- // Set the correct header, if data is being sent
1761
- if ( data )
1762
- xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
1763
-
1764
- // Set the If-Modified-Since header, if ifModified mode.
1765
- if ( ifModified )
1766
- xml.setRequestHeader("If-Modified-Since",
1767
- jQuery.lastModified[url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
1768
-
1769
- // Set header so the called script knows that it's an XMLHttpRequest
1770
- xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
1771
-
1772
- // Make sure the browser sends the right content length
1773
- if ( xml.overrideMimeType )
1774
- xml.setRequestHeader("Connection", "close");
1775
-
1776
- // Wait for a response to come back
1777
- var onreadystatechange = function(istimeout){
1778
- // The transfer is complete and the data is available, or the request timed out
1779
- if ( xml && (xml.readyState == 4 || istimeout == "timeout") ) {
1780
- requestDone = true;
1781
2338
 
1782
- var status = jQuery.httpSuccess( xml ) && istimeout != "timeout" ?
1783
- ifModified && jQuery.httpNotModified( xml, url ) ? "notmodified" : "success" : "error";
1784
-
1785
- // Make sure that the request was successful or notmodified
1786
- if ( status != "error" ) {
1787
- // Cache Last-Modified header, if ifModified mode.
1788
- var modRes;
1789
- try {
1790
- modRes = xml.getResponseHeader("Last-Modified");
1791
- } catch(e) {} // swallow exception thrown by FF if header is not available
1792
-
1793
- if ( ifModified && modRes )
1794
- jQuery.lastModified[url] = modRes;
1795
-
1796
- // If a local callback was specified, fire it
1797
- if ( success )
1798
- success( jQuery.httpData( xml, dataType ), status );
1799
-
1800
- // Fire the global callback
1801
- if( global )
1802
- jQuery.event.trigger( "ajaxSuccess" );
1803
-
1804
- // Otherwise, the request was not successful
1805
- } else {
1806
- // If a local callback was specified, fire it
1807
- if ( error ) error( xml, status );
1808
-
1809
- // Fire the global callback
1810
- if( global )
1811
- jQuery.event.trigger( "ajaxError" );
1812
- }
1813
-
1814
- // The request was completed
1815
- if( global )
1816
- jQuery.event.trigger( "ajaxComplete" );
1817
-
1818
- // Handle the global AJAX counter
1819
- if ( global && ! --jQuery.active )
1820
- jQuery.event.trigger( "ajaxStop" );
1821
-
1822
- // Process result
1823
- if ( ret ) ret(xml, status);
1824
-
1825
- // Stop memory leaks
1826
- xml.onreadystatechange = function(){};
1827
- xml = null;
1828
-
1829
- }
2339
+ return true;
1830
2340
  };
1831
- xml.onreadystatechange = onreadystatechange;
1832
-
1833
- // Timeout checker
1834
- if(timeout > 0)
1835
- setTimeout(function(){
1836
- // Check to see if the request is still happening
1837
- if (xml) {
1838
- // Cancel the request
1839
- xml.abort();
1840
-
1841
- if ( !requestDone ) onreadystatechange( "timeout" );
1842
-
1843
- // Clear from memory
1844
- xml = null;
1845
- }
1846
- }, timeout);
1847
-
1848
- // Send the data
1849
- xml.send(data);
1850
- },
1851
-
1852
- // Counter for holding the number of active queries
1853
- active: 0,
1854
-
1855
- // Determines if an XMLHttpRequest was successful or not
1856
- httpSuccess: function(r) {
1857
- try {
1858
- return !r.status && location.protocol == "file:" ||
1859
- ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
1860
- jQuery.browser.safari && r.status == undefined;
1861
- } catch(e){}
1862
-
1863
- return false;
1864
- },
1865
-
1866
- // Determines if an XMLHttpRequest returns NotModified
1867
- httpNotModified: function(xml, url) {
1868
- try {
1869
- var xmlRes = xml.getResponseHeader("Last-Modified");
1870
-
1871
- // Firefox always returns 200. check Last-Modified date
1872
- return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
1873
- jQuery.browser.safari && xml.status == undefined;
1874
- } catch(e){}
1875
-
1876
- return false;
1877
- },
1878
-
1879
- /* Get the data out of an XMLHttpRequest.
1880
- * Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
1881
- * otherwise return plain text.
1882
- * (String) data - The type of data that you're expecting back,
1883
- * (e.g. "xml", "html", "script")
1884
- */
1885
- httpData: function(r,type) {
1886
- var ct = r.getResponseHeader("content-type");
1887
- var data = !type && ct && ct.indexOf("xml") >= 0;
1888
- data = type == "xml" || data ? r.responseXML : r.responseText;
1889
-
1890
- // If the type is "script", eval it
1891
- if ( type == "script" ) eval.call( window, data );
1892
-
1893
- // Get the JavaScript object, if JSON is used.
1894
- if ( type == "json" ) eval( "data = " + data );
1895
-
1896
- return data;
1897
- },
1898
2341
 
1899
- // Serialize an array of form elements or a set of
1900
- // key/values into a query string
1901
- param: function(a) {
1902
- var s = [];
1903
-
1904
- // If an array was passed in, assume that it is an array
1905
- // of form elements
1906
- if ( a.constructor == Array || a.jquery ) {
1907
- // Serialize the form elements
1908
- for ( var i = 0; i < a.length; i++ )
1909
- s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
1910
-
1911
- // Otherwise, assume that it's an object of key/value pairs
1912
- } else {
1913
- // Serialize the key/values
1914
- for ( var j in a )
1915
- s.push( j + "=" + encodeURIComponent( a[j] ) );
1916
- }
1917
-
1918
- // Return the resulting serialization
1919
- return s.join("&");
1920
2342
  }
1921
-
1922
2343
  });
1923
- } // close: if(typeof window.jQuery == "undefined") {
2344
+ }