equipment 1.5.103 → 1.5.104

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGES CHANGED
@@ -1,5 +1,9 @@
1
1
  = Equipment Changelog
2
2
 
3
+ == Version 1.5.104
4
+
5
+ Fixup release. The distribution was missing the data dir.
6
+
3
7
  == Version 1.5.103
4
8
 
5
9
  Cleanup and Camping 1.5 compatiblity release.
data/Rakefile CHANGED
@@ -28,15 +28,15 @@ PKG_NAME = "equipment"
28
28
  PKG_DESC = <<-EOF
29
29
  Equipment is a set of extensions you can use with your Camping apps.
30
30
  EOF
31
- PKG_VERSION = "1.5.103"
31
+ PKG_VERSION = "1.5.104"
32
32
  PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
33
33
  PKG_FILES = FileList[
34
34
  '[A-Z]*',
35
35
  'bin/**/*',
36
36
  'doc/**/*',
37
+ 'data/**/*',
37
38
  'example/**/*',
38
- 'lib/**/*.rb',
39
- 'share/**/*'
39
+ 'lib/**/*.rb'
40
40
  ]
41
41
 
42
42
  CLOBBER.include('test/test.log')
@@ -0,0 +1,234 @@
1
+
2
+ // BEGIN: DATE OBJECT PATCHES
3
+
4
+ /** Adds the number of days array to the Date object. */
5
+ Date._MD = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
6
+
7
+ /** Constants used for time computations */
8
+ Date.SECOND = 1000 /* milliseconds */;
9
+ Date.MINUTE = 60 * Date.SECOND;
10
+ Date.HOUR = 60 * Date.MINUTE;
11
+ Date.DAY = 24 * Date.HOUR;
12
+ Date.WEEK = 7 * Date.DAY;
13
+
14
+ Date.parseDate = function(str, fmt) {
15
+ var today = new Date();
16
+ var y = 0;
17
+ var m = -1;
18
+ var d = 0;
19
+ var a = str.split(/\W+/);
20
+ var b = fmt.match(/%./g);
21
+ var i = 0, j = 0;
22
+ var hr = 0;
23
+ var min = 0;
24
+ for (i = 0; i < a.length; ++i) {
25
+ if (!a[i])
26
+ continue;
27
+ switch (b[i]) {
28
+ case "%d":
29
+ case "%e":
30
+ d = parseInt(a[i], 10);
31
+ break;
32
+
33
+ case "%m":
34
+ m = parseInt(a[i], 10) - 1;
35
+ break;
36
+
37
+ case "%Y":
38
+ case "%y":
39
+ y = parseInt(a[i], 10);
40
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
41
+ break;
42
+
43
+ case "%b":
44
+ case "%B":
45
+ for (j = 0; j < 12; ++j) {
46
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { m = j; break; }
47
+ }
48
+ break;
49
+
50
+ case "%H":
51
+ case "%I":
52
+ case "%k":
53
+ case "%l":
54
+ hr = parseInt(a[i], 10);
55
+ break;
56
+
57
+ case "%P":
58
+ case "%p":
59
+ if (/pm/i.test(a[i]) && hr < 12)
60
+ hr += 12;
61
+ else if (/am/i.test(a[i]) && hr >= 12)
62
+ hr -= 12;
63
+ break;
64
+
65
+ case "%M":
66
+ min = parseInt(a[i], 10);
67
+ break;
68
+ }
69
+ }
70
+ if (isNaN(y)) y = today.getFullYear();
71
+ if (isNaN(m)) m = today.getMonth();
72
+ if (isNaN(d)) d = today.getDate();
73
+ if (isNaN(hr)) hr = today.getHours();
74
+ if (isNaN(min)) min = today.getMinutes();
75
+ if (y != 0 && m != -1 && d != 0)
76
+ return new Date(y, m, d, hr, min, 0);
77
+ y = 0; m = -1; d = 0;
78
+ for (i = 0; i < a.length; ++i) {
79
+ if (a[i].search(/[a-zA-Z]+/) != -1) {
80
+ var t = -1;
81
+ for (j = 0; j < 12; ++j) {
82
+ if (Calendar._MN[j].substr(0, a[i].length).toLowerCase() == a[i].toLowerCase()) { t = j; break; }
83
+ }
84
+ if (t != -1) {
85
+ if (m != -1) {
86
+ d = m+1;
87
+ }
88
+ m = t;
89
+ }
90
+ } else if (parseInt(a[i], 10) <= 12 && m == -1) {
91
+ m = a[i]-1;
92
+ } else if (parseInt(a[i], 10) > 31 && y == 0) {
93
+ y = parseInt(a[i], 10);
94
+ (y < 100) && (y += (y > 29) ? 1900 : 2000);
95
+ } else if (d == 0) {
96
+ d = a[i];
97
+ }
98
+ }
99
+ if (y == 0)
100
+ y = today.getFullYear();
101
+ if (m != -1 && d != 0)
102
+ return new Date(y, m, d, hr, min, 0);
103
+ return today;
104
+ };
105
+
106
+ /** Returns the number of days in the current month */
107
+ Date.prototype.getMonthDays = function(month) {
108
+ var year = this.getFullYear();
109
+ if (typeof month == "undefined") {
110
+ month = this.getMonth();
111
+ }
112
+ if (((0 == (year%4)) && ( (0 != (year%100)) || (0 == (year%400)))) && month == 1) {
113
+ return 29;
114
+ } else {
115
+ return Date._MD[month];
116
+ }
117
+ };
118
+
119
+ /** Returns the number of day in the year. */
120
+ Date.prototype.getDayOfYear = function() {
121
+ var now = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
122
+ var then = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
123
+ var time = now - then;
124
+ return Math.floor(time / Date.DAY);
125
+ };
126
+
127
+ /** Returns the number of the week in year, as defined in ISO 8601. */
128
+ Date.prototype.getWeekNumber = function() {
129
+ var d = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
130
+ var DoW = d.getDay();
131
+ d.setDate(d.getDate() - (DoW + 6) % 7 + 3); // Nearest Thu
132
+ var ms = d.valueOf(); // GMT
133
+ d.setMonth(0);
134
+ d.setDate(4); // Thu in Week 1
135
+ return Math.round((ms - d.valueOf()) / (7 * 864e5)) + 1;
136
+ };
137
+
138
+ /** Checks date and time equality */
139
+ Date.prototype.equalsTo = function(date) {
140
+ return ((this.getFullYear() == date.getFullYear()) &&
141
+ (this.getMonth() == date.getMonth()) &&
142
+ (this.getDate() == date.getDate()) &&
143
+ (this.getHours() == date.getHours()) &&
144
+ (this.getMinutes() == date.getMinutes()));
145
+ };
146
+
147
+ /** Set only the year, month, date parts (keep existing time) */
148
+ Date.prototype.setDateOnly = function(date) {
149
+ var tmp = new Date(date);
150
+ this.setDate(1);
151
+ this.setFullYear(tmp.getFullYear());
152
+ this.setMonth(tmp.getMonth());
153
+ this.setDate(tmp.getDate());
154
+ };
155
+
156
+ /** Prints the date in a string according to the given format. */
157
+ Date.prototype.print = function (str) {
158
+ var m = this.getMonth();
159
+ var d = this.getDate();
160
+ var y = this.getFullYear();
161
+ var wn = this.getWeekNumber();
162
+ var w = this.getDay();
163
+ var s = {};
164
+ var hr = this.getHours();
165
+ var pm = (hr >= 12);
166
+ var ir = (pm) ? (hr - 12) : hr;
167
+ var dy = this.getDayOfYear();
168
+ if (ir == 0)
169
+ ir = 12;
170
+ var min = this.getMinutes();
171
+ var sec = this.getSeconds();
172
+ // s["%a"] = Calendar._SDN[w]; // abbreviated weekday name [FIXME: I18N]
173
+ // s["%A"] = Calendar._DN[w]; // full weekday name
174
+ // s["%b"] = Calendar._SMN[m]; // abbreviated month name [FIXME: I18N]
175
+ // s["%B"] = Calendar._MN[m]; // full month name
176
+ // FIXME: %c : preferred date and time representation for the current locale
177
+ s["%C"] = 1 + Math.floor(y / 100); // the century number
178
+ s["%d"] = (d < 10) ? ("0" + d) : d; // the day of the month (range 01 to 31)
179
+ s["%e"] = d; // the day of the month (range 1 to 31)
180
+ // FIXME: %D : american date style: %m/%d/%y
181
+ // FIXME: %E, %F, %G, %g, %h (man strftime)
182
+ s["%H"] = (hr < 10) ? ("0" + hr) : hr; // hour, range 00 to 23 (24h format)
183
+ s["%I"] = (ir < 10) ? ("0" + ir) : ir; // hour, range 01 to 12 (12h format)
184
+ s["%j"] = (dy < 100) ? ((dy < 10) ? ("00" + dy) : ("0" + dy)) : dy; // day of the year (range 001 to 366)
185
+ s["%k"] = hr; // hour, range 0 to 23 (24h format)
186
+ s["%l"] = ir; // hour, range 1 to 12 (12h format)
187
+ s["%m"] = (m < 9) ? ("0" + (1+m)) : (1+m); // month, range 01 to 12
188
+ s["%M"] = (min < 10) ? ("0" + min) : min; // minute, range 00 to 59
189
+ s["%n"] = "\n"; // a newline character
190
+ s["%p"] = pm ? "PM" : "AM";
191
+ s["%P"] = pm ? "pm" : "am";
192
+ // FIXME: %r : the time in am/pm notation %I:%M:%S %p
193
+ // FIXME: %R : the time in 24-hour notation %H:%M
194
+ s["%s"] = Math.floor(this.getTime() / 1000);
195
+ s["%S"] = (sec < 10) ? ("0" + sec) : sec; // seconds, range 00 to 59
196
+ s["%t"] = "\t"; // a tab character
197
+ // FIXME: %T : the time in 24-hour notation (%H:%M:%S)
198
+ s["%U"] = s["%W"] = s["%V"] = (wn < 10) ? ("0" + wn) : wn;
199
+ s["%u"] = w + 1; // the day of the week (range 1 to 7, 1 = MON)
200
+ s["%w"] = w; // the day of the week (range 0 to 6, 0 = SUN)
201
+ // FIXME: %x : preferred date representation for the current locale without the time
202
+ // FIXME: %X : preferred time representation for the current locale without the date
203
+ s["%y"] = ('' + y).substr(2, 2); // year without the century (range 00 to 99)
204
+ s["%Y"] = y; // year with the century
205
+ s["%%"] = "%"; // a literal '%' character
206
+
207
+ var re = /%./g;
208
+ // if (!Calendar.is_ie5 && !Calendar.is_khtml)
209
+ // return str.replace(re, function (par) { return s[par] || par; });
210
+
211
+ var a = str.match(re);
212
+ for (var i = 0; i < a.length; i++) {
213
+ var tmp = s[a[i]];
214
+ if (tmp) {
215
+ re = new RegExp(a[i], 'g');
216
+ str = str.replace(re, tmp);
217
+ }
218
+ }
219
+
220
+ return str;
221
+ };
222
+
223
+ Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
224
+ Date.prototype.setFullYear = function(y) {
225
+ var d = new Date(this);
226
+ d.__msh_oldSetFullYear(y);
227
+ if (d.getMonth() != this.getMonth())
228
+ this.setDate(28);
229
+ this.__msh_oldSetFullYear(y);
230
+ };
231
+
232
+ // END: DATE OBJECT PATCHES
233
+
234
+
@@ -0,0 +1,23 @@
1
+ // TODO : Fix some bug here
2
+ function confirm_event(elem, event) {
3
+ var source = Event.element(event);
4
+ var message = ''
5
+ if (source.value) {
6
+ message = source.value
7
+ } else {
8
+ message = source.innerHTML
9
+ }
10
+
11
+ var answer = confirm('Are you sure you want to ' + message + ' ?')
12
+ if (!answer) {
13
+ Event.stop(event);
14
+ }
15
+ }
16
+
17
+ EventSelector.register({
18
+ 'FORM.confirm:submit': confirm_event,
19
+ 'A.confirm:click': confirm_event,
20
+ 'INPUT.confirm:click': confirm_event,
21
+ 'BUTTON.confirm:click': confirm_event
22
+ })
23
+
@@ -0,0 +1,145 @@
1
+ // EventSelector
2
+
3
+ // This is a modified version for Equipment
4
+
5
+ // Copyright (c) 2005-2006 Justin Palmer (http://encytemedia.com)
6
+ // Examples and documentation (http://encytemedia.com/event-selectors)
7
+ //
8
+ // EventSelectors allow you access to Javascript events using a CSS style syntax.
9
+ // It goes one step beyond Javascript events to also give you :loaded, which allows
10
+ // you to wait until an item is loaded in the document before you begin to interact
11
+ // with it.
12
+ //
13
+ // Inspired by the work of Ben Nolan's Behaviour (http://bennolan.com/behaviour)
14
+ //
15
+ // Permission is hereby granted, free of charge, to any person obtaining
16
+ // a copy of this software and associated documentation files (the
17
+ // "Software"), to deal in the Software without restriction, including
18
+ // without limitation the rights to use, copy, modify, merge, publish,
19
+ // distribute, sublicense, and/or sell copies of the Software, and to
20
+ // permit persons to whom the Software is furnished to do so, subject to
21
+ // the following conditions:
22
+ //
23
+ // The above copyright notice and this permission notice shall be
24
+ // included in all copies or substantial portions of the Software.
25
+ //
26
+ // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27
+ // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
28
+ // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29
+ // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
30
+ // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
31
+ // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
32
+ // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33
+ //
34
+
35
+ if (!Ajax) {
36
+ throw "The Prototype library is not available for EventSelector. Please include that first."
37
+ }
38
+
39
+ var clone = function(obj) {
40
+ for(var key in obj) { this[key] = obj[key] }
41
+ }
42
+
43
+
44
+ var EventSelector = {
45
+ version: '1.0_pre',
46
+ cache: {},
47
+ started: false,
48
+ rules: {},
49
+
50
+ start: function() {
51
+ this.timer = new Array();
52
+ this.started = true;
53
+ this.register(this.rules);
54
+ },
55
+
56
+ reload: function(){
57
+ this.register(this.rules);
58
+ },
59
+
60
+ register: function(rules){
61
+ this._extendRules(new clone(rules))._each(
62
+ function(rule) { this.assign(rule.key, rule.value); }.bind(this)
63
+ );
64
+ },
65
+
66
+ unregister: function(rules){
67
+ this._extendRules(new clone(rules))._each(
68
+ function(rule) { this.deassign(rule.key); }.bind(this)
69
+ );
70
+ },
71
+
72
+ assign: function(key, value) {
73
+ this.deassign(key);
74
+ this.rules[key] = value;
75
+
76
+ if (this.started) {
77
+ var rule = [key, value];
78
+ rule.key = key; rule.value = value;
79
+
80
+ var observer = null;
81
+ var selectors = $A(rule.key.split(','));
82
+ selectors.each(function(selector) {
83
+ var pair = selector.split(':');
84
+ var event = pair[1];
85
+ $$(pair[0]).each(function(element) {
86
+ if(pair[1] == '' || pair.length == 1) return rule.value(element);
87
+ if(event.toLowerCase() == 'loaded') {
88
+ this.timer[pair[0]] = setInterval(this._checkLoaded.bind(this, element, pair[0], rule), 15);
89
+ } else {
90
+ observer = function(event) {
91
+ var element = Event.element(event);
92
+ if (element.nodeType == 3) // Safari Bug (Fixed in Webkit)
93
+ element = element.parentNode;
94
+ rule.value($(element), event);
95
+ }
96
+ this.cache[key] || (this.cache[key] = []);
97
+ this.cache[key].push([element, event, observer]);
98
+ Event.observe(element, event, observer);
99
+ }
100
+ }.bind(this));
101
+ }.bind(this));
102
+ }
103
+ },
104
+
105
+ deassign: function(key) {
106
+ if (!this.cache || !this.cache[key]) return;
107
+ for (var i = 0; i < this.cache[key].length; i++) {
108
+ Event.stopObserving.apply(this, this.cache[key][i]);
109
+ }
110
+ delete this.cache[key];
111
+ delete this.rules[key];
112
+ },
113
+
114
+ _checkLoaded: function(element, timer, rule) {
115
+ var node = $(element);
116
+ if(element.tagName != 'undefined') {
117
+ clearInterval(this.timer[timer]);
118
+ rule.value(node);
119
+ }
120
+ },
121
+
122
+ _extendRules: function(rules) {
123
+ return Object.extend(rules, {
124
+ _each: function(iterator) {
125
+ for (var key in this) {
126
+ if(key == '_each') continue;
127
+ var value = this[key];
128
+ var pair = [key, value];
129
+ pair.key = key;
130
+ pair.value = value;
131
+ iterator(pair);
132
+ }
133
+ }
134
+ });
135
+ }
136
+ }
137
+
138
+ // Remove/Comment this if you do not wish to reapply Rules automatically
139
+ // on Ajax request.
140
+ Ajax.Responders.register({
141
+ onComplete: function() { EventSelector.reload() }
142
+ });
143
+
144
+ Event.observe(window, 'load', function() { EventSelector.start() })
145
+
@@ -0,0 +1,1826 @@
1
+ /*
2
+ * jQuery - New Wave Javascript
3
+ *
4
+ * Copyright (c) 2006 John Resig (jquery.com)
5
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
6
+ * and GPL (GPL-LICENSE.txt) licenses.
7
+ *
8
+ * $Date: 2006-08-31 13:26:31 -0400 (Thu, 31 Aug 2006) $
9
+ * $Rev: 249 $
10
+ */
11
+
12
+ // Global undefined variable
13
+ window.undefined = window.undefined;
14
+ function jQuery(a,c) {
15
+
16
+ // Shortcut for document ready (because $(document).each() is silly)
17
+ if ( a && a.constructor == Function && jQuery.fn.ready )
18
+ return jQuery(document).ready(a);
19
+
20
+ // Make sure that a selection was provided
21
+ a = a || jQuery.context || document;
22
+
23
+ // Watch for when a jQuery object is passed as the selector
24
+ if ( a.jquery )
25
+ return $( jQuery.merge( a, [] ) );
26
+
27
+ // Watch for when a jQuery object is passed at the context
28
+ if ( c && c.jquery )
29
+ return $( c ).find(a);
30
+
31
+ // If the context is global, return a new object
32
+ if ( window == this )
33
+ return new jQuery(a,c);
34
+
35
+ // Handle HTML strings
36
+ var m = /^[^<]*(<.+>)[^>]*$/.exec(a);
37
+ if ( m ) a = jQuery.clean( [ m[1] ] );
38
+
39
+ // Watch for when an array is passed in
40
+ this.get( a.constructor == Array || a.length && !a.nodeType && a[0] != undefined && a[0].nodeType ?
41
+ // Assume that it is an array of DOM Elements
42
+ jQuery.merge( a, [] ) :
43
+
44
+ // Find the matching elements and save them for later
45
+ jQuery.find( a, c ) );
46
+
47
+ // See if an extra function was provided
48
+ var fn = arguments[ arguments.length - 1 ];
49
+
50
+ // If so, execute it in context
51
+ if ( fn && fn.constructor == Function )
52
+ this.each(fn);
53
+ }
54
+
55
+ // Map over the $ in case of overwrite
56
+ if ( typeof $ != "undefined" )
57
+ jQuery._$ = $;
58
+
59
+ // Map the jQuery namespace to the '$' one
60
+ var $ = jQuery;
61
+
62
+ jQuery.fn = jQuery.prototype = {
63
+ jquery: "$Rev: 249 $",
64
+
65
+ size: function() {
66
+ return this.length;
67
+ },
68
+
69
+ get: function( num ) {
70
+ // Watch for when an array (of elements) is passed in
71
+ if ( num && num.constructor == Array ) {
72
+
73
+ // Use a tricky hack to make the jQuery object
74
+ // look and feel like an array
75
+ this.length = 0;
76
+ [].push.apply( this, num );
77
+
78
+ return this;
79
+ } else
80
+ return num == undefined ?
81
+
82
+ // Return a 'clean' array
83
+ jQuery.map( this, function(a){ return a } ) :
84
+
85
+ // Return just the object
86
+ this[num];
87
+ },
88
+ each: function( fn, args ) {
89
+ return jQuery.each( this, fn, args );
90
+ },
91
+
92
+ index: function( obj ) {
93
+ var pos = -1;
94
+ this.each(function(i){
95
+ if ( this == obj ) pos = i;
96
+ });
97
+ return pos;
98
+ },
99
+
100
+ attr: function( key, value, type ) {
101
+ // Check to see if we're setting style values
102
+ return key.constructor != String || value != undefined ?
103
+ this.each(function(){
104
+ // See if we're setting a hash of styles
105
+ if ( value == undefined )
106
+ // Set all the styles
107
+ for ( var prop in key )
108
+ jQuery.attr(
109
+ type ? this.style : this,
110
+ prop, key[prop]
111
+ );
112
+
113
+ // See if we're setting a single key/value style
114
+ else
115
+ jQuery.attr(
116
+ type ? this.style : this,
117
+ key, value
118
+ );
119
+ }) :
120
+
121
+ // Look for the case where we're accessing a style value
122
+ jQuery[ type || "attr" ]( this[0], key );
123
+ },
124
+
125
+ css: function( key, value ) {
126
+ return this.attr( key, value, "curCSS" );
127
+ },
128
+ text: function(e) {
129
+ e = e || this;
130
+ var t = "";
131
+ for ( var j = 0; j < e.length; j++ ) {
132
+ var r = e[j].childNodes;
133
+ for ( var i = 0; i < r.length; i++ )
134
+ if ( r[i].nodeType != 8 )
135
+ t += r[i].nodeType != 1 ?
136
+ r[i].nodeValue : jQuery.fn.text([ r[i] ]);
137
+ }
138
+ return t;
139
+ },
140
+ wrap: function() {
141
+ // The elements to wrap the target around
142
+ var a = jQuery.clean(arguments);
143
+
144
+ // Wrap each of the matched elements individually
145
+ return this.each(function(){
146
+ // Clone the structure that we're using to wrap
147
+ var b = a[0].cloneNode(true);
148
+
149
+ // Insert it before the element to be wrapped
150
+ this.parentNode.insertBefore( b, this );
151
+
152
+ // Find he deepest point in the wrap structure
153
+ while ( b.firstChild )
154
+ b = b.firstChild;
155
+
156
+ // Move the matched element to within the wrap structure
157
+ b.appendChild( this );
158
+ });
159
+ },
160
+ append: function() {
161
+ return this.domManip(arguments, true, 1, function(a){
162
+ this.appendChild( a );
163
+ });
164
+ },
165
+ prepend: function() {
166
+ return this.domManip(arguments, true, -1, function(a){
167
+ this.insertBefore( a, this.firstChild );
168
+ });
169
+ },
170
+ before: function() {
171
+ return this.domManip(arguments, false, 1, function(a){
172
+ this.parentNode.insertBefore( a, this );
173
+ });
174
+ },
175
+ after: function() {
176
+ return this.domManip(arguments, false, -1, function(a){
177
+ this.parentNode.insertBefore( a, this.nextSibling );
178
+ });
179
+ },
180
+ end: function() {
181
+ return this.get( this.stack.pop() );
182
+ },
183
+ find: function(t) {
184
+ return this.pushStack( jQuery.map( this, function(a){
185
+ return jQuery.find(t,a);
186
+ }), arguments );
187
+ },
188
+
189
+ clone: function(deep) {
190
+ return this.pushStack( jQuery.map( this, function(a){
191
+ return a.cloneNode( deep != undefined ? deep : true );
192
+ }), arguments );
193
+ },
194
+
195
+ filter: function(t) {
196
+ return this.pushStack(
197
+ t.constructor == Array &&
198
+ jQuery.map(this,function(a){
199
+ for ( var i = 0; i < t.length; i++ )
200
+ if ( jQuery.filter(t[i],[a]).r.length )
201
+ return a;
202
+ }) ||
203
+
204
+ t.constructor == Boolean &&
205
+ ( t ? this.get() : [] ) ||
206
+
207
+ t.constructor == Function &&
208
+ jQuery.grep( this, t ) ||
209
+
210
+ jQuery.filter(t,this).r, arguments );
211
+ },
212
+
213
+ not: function(t) {
214
+ return this.pushStack( t.constructor == String ?
215
+ jQuery.filter(t,this,false).r :
216
+ jQuery.grep(this,function(a){ return a != t; }), arguments );
217
+ },
218
+
219
+ add: function(t) {
220
+ return this.pushStack( jQuery.merge( this, t.constructor == String ?
221
+ jQuery.find(t) : t.constructor == Array ? t : [t] ), arguments );
222
+ },
223
+ is: function(expr) {
224
+ return expr ? jQuery.filter(expr,this).r.length > 0 : this.length > 0;
225
+ },
226
+ domManip: function(args, table, dir, fn){
227
+ var clone = this.size() > 1;
228
+ var a = jQuery.clean(args);
229
+
230
+ return this.each(function(){
231
+ var obj = this;
232
+
233
+ if ( table && this.nodeName == "TABLE" && a[0].nodeName != "THEAD" ) {
234
+ var tbody = this.getElementsByTagName("tbody");
235
+
236
+ if ( !tbody.length ) {
237
+ obj = document.createElement("tbody");
238
+ this.appendChild( obj );
239
+ } else
240
+ obj = tbody[0];
241
+ }
242
+
243
+ for ( var i = ( dir < 0 ? a.length - 1 : 0 );
244
+ i != ( dir < 0 ? dir : a.length ); i += dir ) {
245
+ fn.apply( obj, [ clone ? a[i].cloneNode(true) : a[i] ] );
246
+ }
247
+ });
248
+ },
249
+ pushStack: function(a,args) {
250
+ var fn = args && args[args.length-1];
251
+
252
+ if ( !fn || fn.constructor != Function ) {
253
+ if ( !this.stack ) this.stack = [];
254
+ this.stack.push( this.get() );
255
+ this.get( a );
256
+ } else {
257
+ var old = this.get();
258
+ this.get( a );
259
+ if ( fn.constructor == Function )
260
+ return this.each( fn );
261
+ this.get( old );
262
+ }
263
+
264
+ return this;
265
+ }
266
+ };
267
+
268
+ jQuery.extend = jQuery.fn.extend = function(obj,prop) {
269
+ if ( !prop ) { prop = obj; obj = this; }
270
+ for ( var i in prop ) obj[i] = prop[i];
271
+ return obj;
272
+ };
273
+
274
+ jQuery.extend({
275
+ init: function(){
276
+ jQuery.initDone = true;
277
+
278
+ jQuery.each( jQuery.macros.axis, function(i,n){
279
+ jQuery.fn[ i ] = function(a) {
280
+ var ret = jQuery.map(this,n);
281
+ if ( a && a.constructor == String )
282
+ ret = jQuery.filter(a,ret).r;
283
+ return this.pushStack( ret, arguments );
284
+ };
285
+ });
286
+
287
+ jQuery.each( jQuery.macros.to, function(i,n){
288
+ jQuery.fn[ i ] = function(){
289
+ var a = arguments;
290
+ return this.each(function(){
291
+ for ( var j = 0; j < a.length; j++ )
292
+ $(a[j])[n]( this );
293
+ });
294
+ };
295
+ });
296
+
297
+ jQuery.each( jQuery.macros.each, function(i,n){
298
+ jQuery.fn[ i ] = function() {
299
+ return this.each( n, arguments );
300
+ };
301
+ });
302
+
303
+ jQuery.each( jQuery.macros.filter, function(i,n){
304
+ jQuery.fn[ n ] = function(num,fn) {
305
+ return this.filter( ":" + n + "(" + num + ")", fn );
306
+ };
307
+ });
308
+
309
+ jQuery.each( jQuery.macros.attr, function(i,n){
310
+ n = n || i;
311
+ jQuery.fn[ i ] = function(h) {
312
+ return h == undefined ?
313
+ this.length ? this[0][n] : null :
314
+ this.attr( n, h );
315
+ };
316
+ });
317
+
318
+ jQuery.each( jQuery.macros.css, function(i,n){
319
+ jQuery.fn[ n ] = function(h) {
320
+ return h == undefined ?
321
+ ( this.length ? jQuery.css( this[0], n ) : null ) :
322
+ this.css( n, h );
323
+ };
324
+ });
325
+
326
+ },
327
+ each: function( obj, fn, args ) {
328
+ if ( obj.length == undefined )
329
+ for ( var i in obj )
330
+ fn.apply( obj[i], args || [i, obj[i]] );
331
+ else
332
+ for ( var i = 0; i < obj.length; i++ )
333
+ fn.apply( obj[i], args || [i, obj[i]] );
334
+ return obj;
335
+ },
336
+
337
+ className: {
338
+ add: function(o,c){
339
+ if (jQuery.className.has(o,c)) return;
340
+ o.className += ( o.className ? " " : "" ) + c;
341
+ },
342
+ remove: function(o,c){
343
+ o.className = !c ? "" :
344
+ o.className.replace(
345
+ new RegExp("(^|\\s*\\b[^-])"+c+"($|\\b(?=[^-]))", "g"), "");
346
+ },
347
+ has: function(e,a) {
348
+ if ( e.className != undefined )
349
+ e = e.className;
350
+ return new RegExp("(^|\\s)" + a + "(\\s|$)").test(e);
351
+ }
352
+ },
353
+ swap: function(e,o,f) {
354
+ for ( var i in o ) {
355
+ e.style["old"+i] = e.style[i];
356
+ e.style[i] = o[i];
357
+ }
358
+ f.apply( e, [] );
359
+ for ( var i in o )
360
+ e.style[i] = e.style["old"+i];
361
+ },
362
+
363
+ css: function(e,p) {
364
+ if ( p == "height" || p == "width" ) {
365
+ var old = {}, oHeight, oWidth, d = ["Top","Bottom","Right","Left"];
366
+
367
+ for ( var i in d ) {
368
+ old["padding" + d[i]] = 0;
369
+ old["border" + d[i] + "Width"] = 0;
370
+ }
371
+
372
+ jQuery.swap( e, old, function() {
373
+ if (jQuery.css(e,"display") != "none") {
374
+ oHeight = e.offsetHeight;
375
+ oWidth = e.offsetWidth;
376
+ } else {
377
+ e = $(e.cloneNode(true)).css({
378
+ visibility: "hidden", position: "absolute", display: "block"
379
+ }).prependTo("body")[0];
380
+
381
+ oHeight = e.clientHeight;
382
+ oWidth = e.clientWidth;
383
+
384
+ e.parentNode.removeChild(e);
385
+ }
386
+ });
387
+
388
+ return p == "height" ? oHeight : oWidth;
389
+ } else if ( p == "opacity" && jQuery.browser.msie )
390
+ return parseFloat( jQuery.curCSS(e,"filter").replace(/[^0-9.]/,"") ) || 1;
391
+
392
+ return jQuery.curCSS( e, p );
393
+ },
394
+
395
+ curCSS: function(elem, prop, force) {
396
+ var ret;
397
+
398
+ if (!force && elem.style[prop]) {
399
+
400
+ ret = elem.style[prop];
401
+
402
+ } else if (elem.currentStyle) {
403
+
404
+ var newProp = prop.replace(/\-(\w)/g,function(m,c){return c.toUpperCase()});
405
+ ret = elem.currentStyle[prop] || elem.currentStyle[newProp];
406
+
407
+ } else if (document.defaultView && document.defaultView.getComputedStyle) {
408
+
409
+ prop = prop.replace(/([A-Z])/g,"-$1").toLowerCase();
410
+ var cur = document.defaultView.getComputedStyle(elem, null);
411
+
412
+ if ( cur )
413
+ ret = cur.getPropertyValue(prop);
414
+ else if ( prop == 'display' )
415
+ ret = 'none';
416
+ else
417
+ jQuery.swap(elem, { display: 'block' }, function() {
418
+ ret = document.defaultView.getComputedStyle(this,null).getPropertyValue(prop);
419
+ });
420
+
421
+ }
422
+
423
+ return ret;
424
+ },
425
+
426
+ clean: function(a) {
427
+ var r = [];
428
+ for ( var i = 0; i < a.length; i++ ) {
429
+ if ( a[i].constructor == String ) {
430
+
431
+ var table = "";
432
+
433
+ if ( !a[i].indexOf("<thead") || !a[i].indexOf("<tbody") ) {
434
+ table = "thead";
435
+ a[i] = "<table>" + a[i] + "</table>";
436
+ } else if ( !a[i].indexOf("<tr") ) {
437
+ table = "tr";
438
+ a[i] = "<table>" + a[i] + "</table>";
439
+ } else if ( !a[i].indexOf("<td") || !a[i].indexOf("<th") ) {
440
+ table = "td";
441
+ a[i] = "<table><tbody><tr>" + a[i] + "</tr></tbody></table>";
442
+ }
443
+
444
+ var div = document.createElement("div");
445
+ div.innerHTML = a[i];
446
+
447
+ if ( table ) {
448
+ div = div.firstChild;
449
+ if ( table != "thead" ) div = div.firstChild;
450
+ if ( table == "td" ) div = div.firstChild;
451
+ }
452
+
453
+ for ( var j = 0; j < div.childNodes.length; j++ )
454
+ r.push( div.childNodes[j] );
455
+ } else if ( a[i].jquery || a[i].length && !a[i].nodeType )
456
+ for ( var k = 0; k < a[i].length; k++ )
457
+ r.push( a[i][k] );
458
+ else if ( a[i] !== null )
459
+ r.push( a[i].nodeType ? a[i] : document.createTextNode(a[i].toString()) );
460
+ }
461
+ return r;
462
+ },
463
+
464
+ expr: {
465
+ "": "m[2]== '*'||a.nodeName.toUpperCase()==m[2].toUpperCase()",
466
+ "#": "a.getAttribute('id')&&a.getAttribute('id')==m[2]",
467
+ ":": {
468
+ // Position Checks
469
+ lt: "i<m[3]-0",
470
+ gt: "i>m[3]-0",
471
+ nth: "m[3]-0==i",
472
+ eq: "m[3]-0==i",
473
+ first: "i==0",
474
+ last: "i==r.length-1",
475
+ even: "i%2==0",
476
+ odd: "i%2",
477
+
478
+ // Child Checks
479
+ "nth-child": "jQuery.sibling(a,m[3]).cur",
480
+ "first-child": "jQuery.sibling(a,0).cur",
481
+ "last-child": "jQuery.sibling(a,0).last",
482
+ "only-child": "jQuery.sibling(a).length==1",
483
+
484
+ // Parent Checks
485
+ parent: "a.childNodes.length",
486
+ empty: "!a.childNodes.length",
487
+
488
+ // Text Check
489
+ contains: "(a.innerText||a.innerHTML).indexOf(m[3])>=0",
490
+
491
+ // Visibility
492
+ visible: "a.type!='hidden'&&jQuery.css(a,'display')!='none'&&jQuery.css(a,'visibility')!='hidden'",
493
+ hidden: "a.type=='hidden'||jQuery.css(a,'display')=='none'||jQuery.css(a,'visibility')=='hidden'",
494
+
495
+ // Form elements
496
+ enabled: "!a.disabled",
497
+ disabled: "a.disabled",
498
+ checked: "a.checked",
499
+ selected: "a.selected"
500
+ },
501
+ ".": "jQuery.className.has(a,m[2])",
502
+ "@": {
503
+ "=": "z==m[4]",
504
+ "!=": "z!=m[4]",
505
+ "^=": "!z.indexOf(m[4])",
506
+ "$=": "z.substr(z.length - m[4].length,m[4].length)==m[4]",
507
+ "*=": "z.indexOf(m[4])>=0",
508
+ "": "z"
509
+ },
510
+ "[": "jQuery.find(m[2],a).length"
511
+ },
512
+
513
+ token: [
514
+ "\\.\\.|/\\.\\.", "a.parentNode",
515
+ ">|/", "jQuery.sibling(a.firstChild)",
516
+ "\\+", "jQuery.sibling(a).next",
517
+ "~", function(a){
518
+ var r = [];
519
+ var s = jQuery.sibling(a);
520
+ if ( s.n > 0 )
521
+ for ( var i = s.n; i < s.length; i++ )
522
+ r.push( s[i] );
523
+ return r;
524
+ }
525
+ ],
526
+ find: function( t, context ) {
527
+ // Make sure that the context is a DOM Element
528
+ if ( context && context.nodeType == undefined )
529
+ context = null;
530
+
531
+ // Set the correct context (if none is provided)
532
+ context = context || jQuery.context || document;
533
+
534
+ if ( t.constructor != String ) return [t];
535
+
536
+ if ( !t.indexOf("//") ) {
537
+ context = context.documentElement;
538
+ t = t.substr(2,t.length);
539
+ } else if ( !t.indexOf("/") ) {
540
+ context = context.documentElement;
541
+ t = t.substr(1,t.length);
542
+ // FIX Assume the root element is right :(
543
+ if ( t.indexOf("/") >= 1 )
544
+ t = t.substr(t.indexOf("/"),t.length);
545
+ }
546
+
547
+ var ret = [context];
548
+ var done = [];
549
+ var last = null;
550
+
551
+ while ( t.length > 0 && last != t ) {
552
+ var r = [];
553
+ last = t;
554
+
555
+ t = jQuery.trim(t).replace( /^\/\//i, "" );
556
+
557
+ var foundToken = false;
558
+
559
+ for ( var i = 0; i < jQuery.token.length; i += 2 ) {
560
+ if ( foundToken ) continue;
561
+
562
+ var re = new RegExp("^(" + jQuery.token[i] + ")");
563
+ var m = re.exec(t);
564
+
565
+ if ( m ) {
566
+ r = ret = jQuery.map( ret, jQuery.token[i+1] );
567
+ t = jQuery.trim( t.replace( re, "" ) );
568
+ foundToken = true;
569
+ }
570
+ }
571
+
572
+ if ( !foundToken ) {
573
+ if ( !t.indexOf(",") || !t.indexOf("|") ) {
574
+ if ( ret[0] == context ) ret.shift();
575
+ done = jQuery.merge( done, ret );
576
+ r = ret = [context];
577
+ t = " " + t.substr(1,t.length);
578
+ } else {
579
+ var re2 = /^([#.]?)([a-z0-9\\*_-]*)/i;
580
+ var m = re2.exec(t);
581
+
582
+ if ( m[1] == "#" ) {
583
+ // Ummm, should make this work in all XML docs
584
+ var oid = document.getElementById(m[2]);
585
+ r = ret = oid ? [oid] : [];
586
+ t = t.replace( re2, "" );
587
+ } else {
588
+ if ( !m[2] || m[1] == "." ) m[2] = "*";
589
+
590
+ for ( var i = 0; i < ret.length; i++ )
591
+ r = jQuery.merge( r,
592
+ m[2] == "*" ?
593
+ jQuery.getAll(ret[i]) :
594
+ ret[i].getElementsByTagName(m[2])
595
+ );
596
+ }
597
+ }
598
+
599
+ }
600
+
601
+ if ( t ) {
602
+ var val = jQuery.filter(t,r);
603
+ ret = r = val.r;
604
+ t = jQuery.trim(val.t);
605
+ }
606
+ }
607
+
608
+ if ( ret && ret[0] == context ) ret.shift();
609
+ done = jQuery.merge( done, ret );
610
+
611
+ return done;
612
+ },
613
+
614
+ getAll: function(o,r) {
615
+ r = r || [];
616
+ var s = o.childNodes;
617
+ for ( var i = 0; i < s.length; i++ )
618
+ if ( s[i].nodeType == 1 ) {
619
+ r.push( s[i] );
620
+ jQuery.getAll( s[i], r );
621
+ }
622
+ return r;
623
+ },
624
+
625
+ attr: function(elem, name, value){
626
+ var fix = {
627
+ "for": "htmlFor",
628
+ "class": "className",
629
+ "float": "cssFloat",
630
+ innerHTML: "innerHTML",
631
+ className: "className",
632
+ value: "value",
633
+ disabled: "disabled"
634
+ };
635
+
636
+ if ( fix[name] ) {
637
+ if ( value != undefined ) elem[fix[name]] = value;
638
+ return elem[fix[name]];
639
+ } else if ( elem.getAttribute ) {
640
+ if ( value != undefined ) elem.setAttribute( name, value );
641
+ return elem.getAttribute( name, 2 );
642
+ } else {
643
+ name = name.replace(/-([a-z])/ig,function(z,b){return b.toUpperCase();});
644
+ if ( value != undefined ) elem[name] = value;
645
+ return elem[name];
646
+ }
647
+ },
648
+
649
+ // The regular expressions that power the parsing engine
650
+ parse: [
651
+ // Match: [@value='test'], [@foo]
652
+ [ "\\[ *(@)S *([!*$^=]*) *Q\\]", 1 ],
653
+
654
+ // Match: [div], [div p]
655
+ [ "(\\[)Q\\]", 0 ],
656
+
657
+ // Match: :contains('foo')
658
+ [ "(:)S\\(Q\\)", 0 ],
659
+
660
+ // Match: :even, :last-chlid
661
+ [ "([:.#]*)S", 0 ]
662
+ ],
663
+
664
+ filter: function(t,r,not) {
665
+ // Figure out if we're doing regular, or inverse, filtering
666
+ var g = not !== false ? jQuery.grep :
667
+ function(a,f) {return jQuery.grep(a,f,true);};
668
+
669
+ while ( t && /^[a-z[({<*:.#]/i.test(t) ) {
670
+
671
+ var p = jQuery.parse;
672
+
673
+ for ( var i = 0; i < p.length; i++ ) {
674
+ var re = new RegExp( "^" + p[i][0]
675
+
676
+ // Look for a string-like sequence
677
+ .replace( 'S', "([a-z*_-][a-z0-9_-]*)" )
678
+
679
+ // Look for something (optionally) enclosed with quotes
680
+ .replace( 'Q', " *'?\"?([^'\"]*?)'?\"? *" ), "i" );
681
+
682
+ var m = re.exec( t );
683
+
684
+ if ( m ) {
685
+ // Re-organize the match
686
+ if ( p[i][1] )
687
+ m = ["", m[1], m[3], m[2], m[4]];
688
+
689
+ // Remove what we just matched
690
+ t = t.replace( re, "" );
691
+
692
+ break;
693
+ }
694
+ }
695
+
696
+ // :not() is a special case that can be optomized by
697
+ // keeping it out of the expression list
698
+ if ( m[1] == ":" && m[2] == "not" )
699
+ r = jQuery.filter(m[3],r,false).r;
700
+
701
+ // Otherwise, find the expression to execute
702
+ else {
703
+ var f = jQuery.expr[m[1]];
704
+ if ( f.constructor != String )
705
+ f = jQuery.expr[m[1]][m[2]];
706
+
707
+ // Build a custom macro to enclose it
708
+ eval("f = function(a,i){" +
709
+ ( m[1] == "@" ? "z=jQuery.attr(a,m[3]);" : "" ) +
710
+ "return " + f + "}");
711
+
712
+ // Execute it against the current filter
713
+ r = g( r, f );
714
+ }
715
+ }
716
+
717
+ // Return an array of filtered elements (r)
718
+ // and the modified expression string (t)
719
+ return { r: r, t: t };
720
+ },
721
+ trim: function(t){
722
+ return t.replace(/^\s+|\s+$/g, "");
723
+ },
724
+ parents: function( elem ){
725
+ var matched = [];
726
+ var cur = elem.parentNode;
727
+ while ( cur && cur != document ) {
728
+ matched.push( cur );
729
+ cur = cur.parentNode;
730
+ }
731
+ return matched;
732
+ },
733
+ sibling: function(elem, pos, not) {
734
+ var elems = [];
735
+
736
+ var siblings = elem.parentNode.childNodes;
737
+ for ( var i = 0; i < siblings.length; i++ ) {
738
+ if ( not === true && siblings[i] == elem ) continue;
739
+
740
+ if ( siblings[i].nodeType == 1 )
741
+ elems.push( siblings[i] );
742
+ if ( siblings[i] == elem )
743
+ elems.n = elems.length - 1;
744
+ }
745
+
746
+ return jQuery.extend( elems, {
747
+ last: elems.n == elems.length - 1,
748
+ cur: pos == "even" && elems.n % 2 == 0 || pos == "odd" && elems.n % 2 || elems[pos] == elem,
749
+ prev: elems[elems.n - 1],
750
+ next: elems[elems.n + 1]
751
+ });
752
+ },
753
+ merge: function(first, second) {
754
+ var result = [];
755
+
756
+ // Move b over to the new array (this helps to avoid
757
+ // StaticNodeList instances)
758
+ for ( var k = 0; k < first.length; k++ )
759
+ result[k] = first[k];
760
+
761
+ // Now check for duplicates between a and b and only
762
+ // add the unique items
763
+ for ( var i = 0; i < second.length; i++ ) {
764
+ var noCollision = true;
765
+
766
+ // The collision-checking process
767
+ for ( var j = 0; j < first.length; j++ )
768
+ if ( second[i] == first[j] )
769
+ noCollision = false;
770
+
771
+ // If the item is unique, add it
772
+ if ( noCollision )
773
+ result.push( second[i] );
774
+ }
775
+
776
+ return result;
777
+ },
778
+ grep: function(elems, fn, inv) {
779
+ // If a string is passed in for the function, make a function
780
+ // for it (a handy shortcut)
781
+ if ( fn.constructor == String )
782
+ fn = new Function("a","i","return " + fn);
783
+
784
+ var result = [];
785
+
786
+ // Go through the array, only saving the items
787
+ // that pass the validator function
788
+ for ( var i = 0; i < elems.length; i++ )
789
+ if ( !inv && fn(elems[i],i) || inv && !fn(elems[i],i) )
790
+ result.push( elems[i] );
791
+
792
+ return result;
793
+ },
794
+ map: function(elems, fn) {
795
+ // If a string is passed in for the function, make a function
796
+ // for it (a handy shortcut)
797
+ if ( fn.constructor == String )
798
+ fn = new Function("a","return " + fn);
799
+
800
+ var result = [];
801
+
802
+ // Go through the array, translating each of the items to their
803
+ // new value (or values).
804
+ for ( var i = 0; i < elems.length; i++ ) {
805
+ var val = fn(elems[i],i);
806
+
807
+ if ( val !== null && val != undefined ) {
808
+ if ( val.constructor != Array ) val = [val];
809
+ result = jQuery.merge( result, val );
810
+ }
811
+ }
812
+
813
+ return result;
814
+ },
815
+
816
+ /*
817
+ * A number of helper functions used for managing events.
818
+ * Many of the ideas behind this code orignated from Dean Edwards' addEvent library.
819
+ */
820
+ event: {
821
+
822
+ // Bind an event to an element
823
+ // Original by Dean Edwards
824
+ add: function(element, type, handler) {
825
+ // For whatever reason, IE has trouble passing the window object
826
+ // around, causing it to be cloned in the process
827
+ if ( jQuery.browser.msie && element.setInterval != undefined )
828
+ element = window;
829
+
830
+ // Make sure that the function being executed has a unique ID
831
+ if ( !handler.guid )
832
+ handler.guid = this.guid++;
833
+
834
+ // Init the element's event structure
835
+ if (!element.events)
836
+ element.events = {};
837
+
838
+ // Get the current list of functions bound to this event
839
+ var handlers = element.events[type];
840
+
841
+ // If it hasn't been initialized yet
842
+ if (!handlers) {
843
+ // Init the event handler queue
844
+ handlers = element.events[type] = {};
845
+
846
+ // Remember an existing handler, if it's already there
847
+ if (element["on" + type])
848
+ handlers[0] = element["on" + type];
849
+ }
850
+
851
+ // Add the function to the element's handler list
852
+ handlers[handler.guid] = handler;
853
+
854
+ // And bind the global event handler to the element
855
+ element["on" + type] = this.handle;
856
+
857
+ // Remember the function in a global list (for triggering)
858
+ if (!this.global[type])
859
+ this.global[type] = [];
860
+ this.global[type].push( element );
861
+ },
862
+
863
+ guid: 1,
864
+ global: {},
865
+
866
+ // Detach an event or set of events from an element
867
+ remove: function(element, type, handler) {
868
+ if (element.events)
869
+ if (type && element.events[type])
870
+ if ( handler )
871
+ delete element.events[type][handler.guid];
872
+ else
873
+ for ( var i in element.events[type] )
874
+ delete element.events[type][i];
875
+ else
876
+ for ( var j in element.events )
877
+ this.remove( element, j );
878
+ },
879
+
880
+ trigger: function(type,data,element) {
881
+ // Touch up the incoming data
882
+ data = data || [];
883
+
884
+ // Handle a global trigger
885
+ if ( !element ) {
886
+ var g = this.global[type];
887
+ if ( g )
888
+ for ( var i = 0; i < g.length; i++ )
889
+ this.trigger( type, data, g[i] );
890
+
891
+ // Handle triggering a single element
892
+ } else if ( element["on" + type] ) {
893
+ // Pass along a fake event
894
+ data.unshift( this.fix({ type: type, target: element }) );
895
+
896
+ // Trigger the event
897
+ element["on" + type].apply( element, data );
898
+ }
899
+ },
900
+
901
+ handle: function(event) {
902
+ if ( typeof jQuery == "undefined" ) return;
903
+
904
+ event = event || jQuery.event.fix( window.event );
905
+
906
+ // If no correct event was found, fail
907
+ if ( !event ) return;
908
+
909
+ var returnValue = true;
910
+
911
+ var c = this.events[event.type];
912
+
913
+ for ( var j in c ) {
914
+ if ( c[j].apply( this, [event] ) === false ) {
915
+ event.preventDefault();
916
+ event.stopPropagation();
917
+ returnValue = false;
918
+ }
919
+ }
920
+
921
+ return returnValue;
922
+ },
923
+
924
+ fix: function(event) {
925
+ if ( event ) {
926
+ event.preventDefault = function() {
927
+ this.returnValue = false;
928
+ };
929
+
930
+ event.stopPropagation = function() {
931
+ this.cancelBubble = true;
932
+ };
933
+ }
934
+
935
+ return event;
936
+ }
937
+
938
+ }
939
+ });
940
+
941
+ new function() {
942
+ var b = navigator.userAgent.toLowerCase();
943
+
944
+ // Figure out what browser is being used
945
+ jQuery.browser = {
946
+ safari: /webkit/.test(b),
947
+ opera: /opera/.test(b),
948
+ msie: /msie/.test(b) && !/opera/.test(b),
949
+ mozilla: /mozilla/.test(b) && !/compatible/.test(b)
950
+ };
951
+
952
+ // Check to see if the W3C box model is being used
953
+ jQuery.boxModel = !jQuery.browser.msie || document.compatMode == "CSS1Compat";
954
+ };
955
+
956
+ jQuery.macros = {
957
+ to: {
958
+ appendTo: "append",
959
+ prependTo: "prepend",
960
+ insertBefore: "before",
961
+ insertAfter: "after"
962
+ },
963
+
964
+
965
+ css: "width,height,top,left,position,float,overflow,color,background".split(","),
966
+
967
+ filter: [ "eq", "lt", "gt", "contains" ],
968
+
969
+ attr: {
970
+
971
+ val: "value",
972
+
973
+ html: "innerHTML",
974
+
975
+ id: null,
976
+
977
+ title: null,
978
+
979
+ name: null,
980
+
981
+ href: null,
982
+
983
+ src: null,
984
+
985
+ rel: null
986
+ },
987
+
988
+ axis: {
989
+
990
+ parent: "a.parentNode",
991
+
992
+ ancestors: jQuery.parents,
993
+
994
+ parents: jQuery.parents,
995
+
996
+ next: "jQuery.sibling(a).next",
997
+
998
+ prev: "jQuery.sibling(a).prev",
999
+
1000
+ siblings: jQuery.sibling,
1001
+
1002
+ children: "jQuery.sibling(a.firstChild)"
1003
+ },
1004
+
1005
+ each: {
1006
+
1007
+ removeAttr: function( key ) {
1008
+ this.removeAttribute( key );
1009
+ },
1010
+ show: function(){
1011
+ this.style.display = this.oldblock ? this.oldblock : "";
1012
+ if ( jQuery.css(this,"display") == "none" )
1013
+ this.style.display = "block";
1014
+ },
1015
+ hide: function(){
1016
+ this.oldblock = this.oldblock || jQuery.css(this,"display");
1017
+ if ( this.oldblock == "none" )
1018
+ this.oldblock = "block";
1019
+ this.style.display = "none";
1020
+ },
1021
+ toggle: function(){
1022
+ $(this)[ $(this).is(":hidden") ? "show" : "hide" ].apply( $(this), arguments );
1023
+ },
1024
+ addClass: function(c){
1025
+ jQuery.className.add(this,c);
1026
+ },
1027
+ removeClass: function(c){
1028
+ jQuery.className.remove(this,c);
1029
+ },
1030
+ toggleClass: function( c ){
1031
+ jQuery.className[ jQuery.className.has(this,c) ? "remove" : "add" ](this,c);
1032
+ },
1033
+
1034
+ remove: function(a){
1035
+ if ( !a || jQuery.filter( a, [this] ).r )
1036
+ this.parentNode.removeChild( this );
1037
+ },
1038
+ empty: function(){
1039
+ while ( this.firstChild )
1040
+ this.removeChild( this.firstChild );
1041
+ },
1042
+ bind: function( type, fn ) {
1043
+ if ( fn.constructor == String )
1044
+ fn = new Function("e", ( !fn.indexOf(".") ? "$(this)" : "return " ) + fn);
1045
+ jQuery.event.add( this, type, fn );
1046
+ },
1047
+
1048
+ unbind: function( type, fn ) {
1049
+ jQuery.event.remove( this, type, fn );
1050
+ },
1051
+ trigger: function( type, data ) {
1052
+ jQuery.event.trigger( type, data, this );
1053
+ }
1054
+ }
1055
+ };
1056
+
1057
+ jQuery.init();
1058
+ jQuery.fn.extend({
1059
+
1060
+ // We're overriding the old toggle function, so
1061
+ // remember it for later
1062
+ _toggle: jQuery.fn.toggle,
1063
+ toggle: function(a,b) {
1064
+ // If two functions are passed in, we're
1065
+ // toggling on a click
1066
+ return a && b && a.constructor == Function && b.constructor == Function ? this.click(function(e){
1067
+ // Figure out which function to execute
1068
+ this.last = this.last == a ? b : a;
1069
+
1070
+ // Make sure that clicks stop
1071
+ e.preventDefault();
1072
+
1073
+ // and execute the function
1074
+ return this.last.apply( this, [e] ) || false;
1075
+ }) :
1076
+
1077
+ // Otherwise, execute the old toggle function
1078
+ this._toggle.apply( this, arguments );
1079
+ },
1080
+
1081
+ hover: function(f,g) {
1082
+
1083
+ // A private function for haandling mouse 'hovering'
1084
+ function handleHover(e) {
1085
+ // Check if mouse(over|out) are still within the same parent element
1086
+ var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
1087
+
1088
+ // Traverse up the tree
1089
+ while ( p && p != this ) p = p.parentNode;
1090
+
1091
+ // If we actually just moused on to a sub-element, ignore it
1092
+ if ( p == this ) return false;
1093
+
1094
+ // Execute the right function
1095
+ return (e.type == "mouseover" ? f : g).apply(this, [e]);
1096
+ }
1097
+
1098
+ // Bind the function to the two event listeners
1099
+ return this.mouseover(handleHover).mouseout(handleHover);
1100
+ },
1101
+ ready: function(f) {
1102
+ // If the DOM is already ready
1103
+ if ( jQuery.isReady )
1104
+ // Execute the function immediately
1105
+ f.apply( document );
1106
+
1107
+ // Otherwise, remember the function for later
1108
+ else {
1109
+ // Add the function to the wait list
1110
+ jQuery.readyList.push( f );
1111
+ }
1112
+
1113
+ return this;
1114
+ }
1115
+ });
1116
+
1117
+ jQuery.extend({
1118
+ /*
1119
+ * All the code that makes DOM Ready work nicely.
1120
+ */
1121
+ isReady: false,
1122
+ readyList: [],
1123
+
1124
+ // Handle when the DOM is ready
1125
+ ready: function() {
1126
+ // Make sure that the DOM is not already loaded
1127
+ if ( !jQuery.isReady ) {
1128
+ // Remember that the DOM is ready
1129
+ jQuery.isReady = true;
1130
+
1131
+ // If there are functions bound, to execute
1132
+ if ( jQuery.readyList ) {
1133
+ // Execute all of them
1134
+ for ( var i = 0; i < jQuery.readyList.length; i++ )
1135
+ jQuery.readyList[i].apply( document );
1136
+
1137
+ // Reset the list of functions
1138
+ jQuery.readyList = null;
1139
+ }
1140
+ }
1141
+ }
1142
+ });
1143
+
1144
+ new function(){
1145
+
1146
+ var e = ("blur,focus,load,resize,scroll,unload,click,dblclick," +
1147
+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,reset,select," +
1148
+ "submit,keydown,keypress,keyup,error").split(",");
1149
+
1150
+ // Go through all the event names, but make sure that
1151
+ // it is enclosed properly
1152
+ for ( var i = 0; i < e.length; i++ ) new function(){
1153
+
1154
+ var o = e[i];
1155
+
1156
+ // Handle event binding
1157
+ jQuery.fn[o] = function(f){
1158
+ return f ? this.bind(o, f) : this.trigger(o);
1159
+ };
1160
+
1161
+ // Handle event unbinding
1162
+ jQuery.fn["un"+o] = function(f){ return this.unbind(o, f); };
1163
+
1164
+ // Finally, handle events that only fire once
1165
+ jQuery.fn["one"+o] = function(f){
1166
+ // Attach the event listener
1167
+ return this.each(function(){
1168
+
1169
+ var count = 0;
1170
+
1171
+ // Add the event
1172
+ jQuery.event.add( this, o, function(e){
1173
+ // If this function has already been executed, stop
1174
+ if ( count++ ) return;
1175
+
1176
+ // And execute the bound function
1177
+ return f.apply(this, [e]);
1178
+ });
1179
+ });
1180
+ };
1181
+
1182
+ };
1183
+
1184
+ // If Mozilla is used
1185
+ if ( jQuery.browser.mozilla || jQuery.browser.opera ) {
1186
+ // Use the handy event callback
1187
+ document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
1188
+
1189
+ // If IE is used, use the excellent hack by Matthias Miller
1190
+ // http://www.outofhanwell.com/blog/index.php?title=the_window_onload_problem_revisited
1191
+ } else if ( jQuery.browser.msie ) {
1192
+
1193
+ // Only works if you document.write() it
1194
+ document.write("<scr" + "ipt id=__ie_init defer=true " +
1195
+ "src=//:><\/script>");
1196
+
1197
+ // Use the defer script hack
1198
+ var script = document.getElementById("__ie_init");
1199
+ script.onreadystatechange = function() {
1200
+ if ( this.readyState != "complete" ) return;
1201
+ this.parentNode.removeChild( this );
1202
+ jQuery.ready();
1203
+ };
1204
+
1205
+ // Clear from memory
1206
+ script = null;
1207
+
1208
+ // If Safari is used
1209
+ } else if ( jQuery.browser.safari ) {
1210
+ // Continually check to see if the document.readyState is valid
1211
+ jQuery.safariTimer = setInterval(function(){
1212
+ // loaded and complete are both valid states
1213
+ if ( document.readyState == "loaded" ||
1214
+ document.readyState == "complete" ) {
1215
+
1216
+ // If either one are found, remove the timer
1217
+ clearInterval( jQuery.safariTimer );
1218
+ jQuery.safariTimer = null;
1219
+
1220
+ // and execute any waiting functions
1221
+ jQuery.ready();
1222
+ }
1223
+ }, 10);
1224
+ }
1225
+
1226
+ // A fallback to window.onload, that will always work
1227
+ jQuery.event.add( window, "load", jQuery.ready );
1228
+
1229
+ };
1230
+ jQuery.fn.extend({
1231
+
1232
+ // overwrite the old show method
1233
+ _show: jQuery.fn.show,
1234
+
1235
+ show: function(speed,callback){
1236
+ return speed ? this.animate({
1237
+ height: "show", width: "show", opacity: "show"
1238
+ }, speed, callback) : this._show();
1239
+ },
1240
+
1241
+ // Overwrite the old hide method
1242
+ _hide: jQuery.fn.hide,
1243
+
1244
+ hide: function(speed,callback){
1245
+ return speed ? this.animate({
1246
+ height: "hide", width: "hide", opacity: "hide"
1247
+ }, speed, callback) : this._hide();
1248
+ },
1249
+
1250
+ slideDown: function(speed,callback){
1251
+ return this.animate({height: "show"}, speed, callback);
1252
+ },
1253
+
1254
+ slideUp: function(speed,callback){
1255
+ return this.animate({height: "hide"}, speed, callback);
1256
+ },
1257
+
1258
+ slideToggle: function(speed,callback){
1259
+ return this.each(function(){
1260
+ var state = $(this).is(":hidden") ? "show" : "hide";
1261
+ $(this).animate({height: state}, speed, callback);
1262
+ });
1263
+ },
1264
+
1265
+ fadeIn: function(speed,callback){
1266
+ return this.animate({opacity: "show"}, speed, callback);
1267
+ },
1268
+
1269
+ fadeOut: function(speed,callback){
1270
+ return this.animate({opacity: "hide"}, speed, callback);
1271
+ },
1272
+
1273
+ fadeTo: function(speed,to,callback){
1274
+ return this.animate({opacity: to}, speed, callback);
1275
+ },
1276
+ animate: function(prop,speed,callback) {
1277
+ return this.queue(function(){
1278
+
1279
+ this.curAnim = prop;
1280
+
1281
+ for ( var p in prop ) {
1282
+ var e = new jQuery.fx( this, jQuery.speed(speed,callback), p );
1283
+ if ( prop[p].constructor == Number )
1284
+ e.custom( e.cur(), prop[p] );
1285
+ else
1286
+ e[ prop[p] ]( prop );
1287
+ }
1288
+
1289
+ });
1290
+ },
1291
+ queue: function(type,fn){
1292
+ if ( !fn ) {
1293
+ fn = type;
1294
+ type = "fx";
1295
+ }
1296
+
1297
+ return this.each(function(){
1298
+ if ( !this.queue )
1299
+ this.queue = {};
1300
+
1301
+ if ( !this.queue[type] )
1302
+ this.queue[type] = [];
1303
+
1304
+ this.queue[type].push( fn );
1305
+
1306
+ if ( this.queue[type].length == 1 )
1307
+ fn.apply(this);
1308
+ });
1309
+ }
1310
+
1311
+ });
1312
+
1313
+ jQuery.extend({
1314
+
1315
+ setAuto: function(e,p) {
1316
+ if ( e.notAuto ) return;
1317
+
1318
+ if ( p == "height" && e.scrollHeight != parseInt(jQuery.curCSS(e,p)) ) return;
1319
+ if ( p == "width" && e.scrollWidth != parseInt(jQuery.curCSS(e,p)) ) return;
1320
+
1321
+ // Remember the original height
1322
+ var a = e.style[p];
1323
+
1324
+ // Figure out the size of the height right now
1325
+ var o = jQuery.curCSS(e,p,1);
1326
+
1327
+ if ( p == "height" && e.scrollHeight != o ||
1328
+ p == "width" && e.scrollWidth != o ) return;
1329
+
1330
+ // Set the height to auto
1331
+ e.style[p] = e.currentStyle ? "" : "auto";
1332
+
1333
+ // See what the size of "auto" is
1334
+ var n = jQuery.curCSS(e,p,1);
1335
+
1336
+ // Revert back to the original size
1337
+ if ( o != n && n != "auto" ) {
1338
+ e.style[p] = a;
1339
+ e.notAuto = true;
1340
+ }
1341
+ },
1342
+
1343
+ speed: function(s,o) {
1344
+ o = o || {};
1345
+
1346
+ if ( o.constructor == Function )
1347
+ o = { complete: o };
1348
+
1349
+ var ss = { slow: 600, fast: 200 };
1350
+ o.duration = (s && s.constructor == Number ? s : ss[s]) || 400;
1351
+
1352
+ // Queueing
1353
+ o.oldComplete = o.complete;
1354
+ o.complete = function(){
1355
+ jQuery.dequeue(this, "fx");
1356
+ if ( o.oldComplete && o.oldComplete.constructor == Function )
1357
+ o.oldComplete.apply( this );
1358
+ };
1359
+
1360
+ return o;
1361
+ },
1362
+
1363
+ queue: {},
1364
+
1365
+ dequeue: function(elem,type){
1366
+ type = type || "fx";
1367
+
1368
+ if ( elem.queue && elem.queue[type] ) {
1369
+ // Remove self
1370
+ elem.queue[type].shift();
1371
+
1372
+ // Get next function
1373
+ var f = elem.queue[type][0];
1374
+
1375
+ if ( f ) f.apply( elem );
1376
+ }
1377
+ },
1378
+
1379
+ /*
1380
+ * I originally wrote fx() as a clone of moo.fx and in the process
1381
+ * of making it small in size the code became illegible to sane
1382
+ * people. You've been warned.
1383
+ */
1384
+
1385
+ fx: function( elem, options, prop ){
1386
+
1387
+ var z = this;
1388
+
1389
+ // The users options
1390
+ z.o = {
1391
+ duration: options.duration || 400,
1392
+ complete: options.complete,
1393
+ step: options.step
1394
+ };
1395
+
1396
+ // The element
1397
+ z.el = elem;
1398
+
1399
+ // The styles
1400
+ var y = z.el.style;
1401
+
1402
+ // Simple function for setting a style value
1403
+ z.a = function(){
1404
+ if ( options.step )
1405
+ options.step.apply( elem, [ z.now ] );
1406
+
1407
+ if ( prop == "opacity" ) {
1408
+ if (jQuery.browser.mozilla && z.now == 1) z.now = 0.9999;
1409
+ if (window.ActiveXObject)
1410
+ y.filter = "alpha(opacity=" + z.now*100 + ")";
1411
+ else
1412
+ y.opacity = z.now;
1413
+
1414
+ // My hate for IE will never die
1415
+ } else if ( parseInt(z.now) )
1416
+ y[prop] = parseInt(z.now) + "px";
1417
+
1418
+ y.display = "block";
1419
+ };
1420
+
1421
+ // Figure out the maximum number to run to
1422
+ z.max = function(){
1423
+ return parseFloat( jQuery.css(z.el,prop) );
1424
+ };
1425
+
1426
+ // Get the current size
1427
+ z.cur = function(){
1428
+ var r = parseFloat( jQuery.curCSS(z.el, prop) );
1429
+ return r && r > -10000 ? r : z.max();
1430
+ };
1431
+
1432
+ // Start an animation from one number to another
1433
+ z.custom = function(from,to){
1434
+ z.startTime = (new Date()).getTime();
1435
+ z.now = from;
1436
+ z.a();
1437
+
1438
+ z.timer = setInterval(function(){
1439
+ z.step(from, to);
1440
+ }, 13);
1441
+ };
1442
+
1443
+ // Simple 'show' function
1444
+ z.show = function( p ){
1445
+ if ( !z.el.orig ) z.el.orig = {};
1446
+
1447
+ // Remember where we started, so that we can go back to it later
1448
+ z.el.orig[prop] = this.cur();
1449
+
1450
+ z.custom( 0, z.el.orig[prop] );
1451
+
1452
+ // Stupid IE, look what you made me do
1453
+ if ( prop != "opacity" )
1454
+ y[prop] = "1px";
1455
+ };
1456
+
1457
+ // Simple 'hide' function
1458
+ z.hide = function(){
1459
+ if ( !z.el.orig ) z.el.orig = {};
1460
+
1461
+ // Remember where we started, so that we can go back to it later
1462
+ z.el.orig[prop] = this.cur();
1463
+
1464
+ z.o.hide = true;
1465
+
1466
+ // Begin the animation
1467
+ z.custom(z.el.orig[prop], 0);
1468
+ };
1469
+
1470
+ // IE has trouble with opacity if it does not have layout
1471
+ if ( jQuery.browser.msie && !z.el.currentStyle.hasLayout )
1472
+ y.zoom = "1";
1473
+
1474
+ // Remember the overflow of the element
1475
+ if ( !z.el.oldOverlay )
1476
+ z.el.oldOverflow = jQuery.css( z.el, "overflow" );
1477
+
1478
+ // Make sure that nothing sneaks out
1479
+ y.overflow = "hidden";
1480
+
1481
+ // Each step of an animation
1482
+ z.step = function(firstNum, lastNum){
1483
+ var t = (new Date()).getTime();
1484
+
1485
+ if (t > z.o.duration + z.startTime) {
1486
+ // Stop the timer
1487
+ clearInterval(z.timer);
1488
+ z.timer = null;
1489
+
1490
+ z.now = lastNum;
1491
+ z.a();
1492
+
1493
+ z.el.curAnim[ prop ] = true;
1494
+
1495
+ var done = true;
1496
+ for ( var i in z.el.curAnim )
1497
+ if ( z.el.curAnim[i] !== true )
1498
+ done = false;
1499
+
1500
+ if ( done ) {
1501
+ // Reset the overflow
1502
+ y.overflow = z.el.oldOverflow;
1503
+
1504
+ // Hide the element if the "hide" operation was done
1505
+ if ( z.o.hide )
1506
+ y.display = 'none';
1507
+
1508
+ // Reset the property, if the item has been hidden
1509
+ if ( z.o.hide ) {
1510
+ for ( var p in z.el.curAnim ) {
1511
+ y[ p ] = z.el.orig[p] + ( p == "opacity" ? "" : "px" );
1512
+
1513
+ // set its height and/or width to auto
1514
+ if ( p == 'height' || p == 'width' )
1515
+ jQuery.setAuto( z.el, p );
1516
+ }
1517
+ }
1518
+ }
1519
+
1520
+ // If a callback was provided, execute it
1521
+ if( done && z.o.complete && z.o.complete.constructor == Function )
1522
+ // Execute the complete function
1523
+ z.o.complete.apply( z.el );
1524
+ } else {
1525
+ // Figure out where in the animation we are and set the number
1526
+ var p = (t - this.startTime) / z.o.duration;
1527
+ z.now = ((-Math.cos(p*Math.PI)/2) + 0.5) * (lastNum-firstNum) + firstNum;
1528
+
1529
+ // Perform the next step of the animation
1530
+ z.a();
1531
+ }
1532
+ };
1533
+
1534
+ }
1535
+
1536
+ });
1537
+ // AJAX Plugin
1538
+ // Docs Here:
1539
+ // http://jquery.com/docs/ajax/
1540
+ jQuery.fn.loadIfModified = function( url, params, callback ) {
1541
+ this.load( url, params, callback, 1 );
1542
+ };
1543
+
1544
+ jQuery.fn.load = function( url, params, callback, ifModified ) {
1545
+ if ( url.constructor == Function )
1546
+ return this.bind("load", url);
1547
+
1548
+ callback = callback || function(){};
1549
+
1550
+ // Default to a GET request
1551
+ var type = "GET";
1552
+
1553
+ // If the second parameter was provided
1554
+ if ( params ) {
1555
+ // If it's a function
1556
+ if ( params.constructor == Function ) {
1557
+ // We assume that it's the callback
1558
+ callback = params;
1559
+ params = null;
1560
+
1561
+ // Otherwise, build a param string
1562
+ } else {
1563
+ params = jQuery.param( params );
1564
+ type = "POST";
1565
+ }
1566
+ }
1567
+
1568
+ var self = this;
1569
+
1570
+ // Request the remote document
1571
+ jQuery.ajax( type, url, params,function(res, status){
1572
+
1573
+ if ( status == "success" || !ifModified && status == "notmodified" ) {
1574
+ // Inject the HTML into all the matched elements
1575
+ self.html(res.responseText).each( callback, [res.responseText, status] );
1576
+
1577
+ // Execute all the scripts inside of the newly-injected HTML
1578
+ $("script", self).each(function(){
1579
+ if ( this.src )
1580
+ $.getScript( this.src );
1581
+ else
1582
+ eval.call( window, this.text || this.textContent || this.innerHTML || "" );
1583
+ });
1584
+ } else
1585
+ callback.apply( self, [res.responseText, status] );
1586
+
1587
+ }, ifModified);
1588
+
1589
+ return this;
1590
+ };
1591
+
1592
+ // If IE is used, create a wrapper for the XMLHttpRequest object
1593
+ if ( jQuery.browser.msie && typeof XMLHttpRequest == "undefined" )
1594
+ XMLHttpRequest = function(){
1595
+ return new ActiveXObject(
1596
+ navigator.userAgent.indexOf("MSIE 5") >= 0 ?
1597
+ "Microsoft.XMLHTTP" : "Msxml2.XMLHTTP"
1598
+ );
1599
+ };
1600
+
1601
+ // Attach a bunch of functions for handling common AJAX events
1602
+ new function(){
1603
+ var e = "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess".split(',');
1604
+
1605
+ for ( var i = 0; i < e.length; i++ ) new function(){
1606
+ var o = e[i];
1607
+ jQuery.fn[o] = function(f){
1608
+ return this.bind(o, f);
1609
+ };
1610
+ };
1611
+ };
1612
+
1613
+ jQuery.extend({
1614
+ get: function( url, data, callback, type, ifModified ) {
1615
+ if ( data.constructor == Function ) {
1616
+ type = callback;
1617
+ callback = data;
1618
+ data = null;
1619
+ }
1620
+
1621
+ if ( data ) url += "?" + jQuery.param(data);
1622
+
1623
+ // Build and start the HTTP Request
1624
+ jQuery.ajax( "GET", url, null, function(r, status) {
1625
+ if ( callback ) callback( jQuery.httpData(r,type), status );
1626
+ }, ifModified);
1627
+ },
1628
+
1629
+ getIfModified: function( url, data, callback, type ) {
1630
+ jQuery.get(url, data, callback, type, 1);
1631
+ },
1632
+
1633
+ getScript: function( url, data, callback ) {
1634
+ jQuery.get(url, data, callback, "script");
1635
+ },
1636
+ post: function( url, data, callback, type ) {
1637
+ // Build and start the HTTP Request
1638
+ jQuery.ajax( "POST", url, jQuery.param(data), function(r, status) {
1639
+ if ( callback ) callback( jQuery.httpData(r,type), status );
1640
+ });
1641
+ },
1642
+
1643
+ // timeout (ms)
1644
+ timeout: 0,
1645
+
1646
+ ajaxTimeout: function(timeout) {
1647
+ jQuery.timeout = timeout;
1648
+ },
1649
+
1650
+ // Last-Modified header cache for next request
1651
+ lastModified: {},
1652
+ ajax: function( type, url, data, ret, ifModified ) {
1653
+ // If only a single argument was passed in,
1654
+ // assume that it is a object of key/value pairs
1655
+ if ( !url ) {
1656
+ ret = type.complete;
1657
+ var success = type.success;
1658
+ var error = type.error;
1659
+ data = type.data;
1660
+ url = type.url;
1661
+ type = type.type;
1662
+ }
1663
+
1664
+ // Watch for a new set of requests
1665
+ if ( ! jQuery.active++ )
1666
+ jQuery.event.trigger( "ajaxStart" );
1667
+
1668
+ var requestDone = false;
1669
+
1670
+ // Create the request object
1671
+ var xml = new XMLHttpRequest();
1672
+
1673
+ // Open the socket
1674
+ xml.open(type || "GET", url, true);
1675
+
1676
+ // Set the correct header, if data is being sent
1677
+ if ( data )
1678
+ xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
1679
+
1680
+ // Set the If-Modified-Since header, if ifModified mode.
1681
+ if ( ifModified )
1682
+ xml.setRequestHeader("If-Modified-Since",
1683
+ jQuery.lastModified[url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
1684
+
1685
+ // Set header so calling script knows that it's an XMLHttpRequest
1686
+ xml.setRequestHeader("X-Requested-With", "XMLHttpRequest");
1687
+
1688
+ // Make sure the browser sends the right content length
1689
+ if ( xml.overrideMimeType )
1690
+ xml.setRequestHeader("Connection", "close");
1691
+
1692
+ // Wait for a response to come back
1693
+ var onreadystatechange = function(istimeout){
1694
+ // The transfer is complete and the data is available, or the request timed out
1695
+ if ( xml && (xml.readyState == 4 || istimeout == "timeout") ) {
1696
+ requestDone = true;
1697
+
1698
+ var status = jQuery.httpSuccess( xml ) && istimeout != "timeout" ?
1699
+ ifModified && jQuery.httpNotModified( xml, url ) ? "notmodified" : "success" : "error";
1700
+
1701
+ // Make sure that the request was successful or notmodified
1702
+ if ( status != "error" ) {
1703
+ // Cache Last-Modified header, if ifModified mode.
1704
+ var modRes = xml.getResponseHeader("Last-Modified");
1705
+ if ( ifModified && modRes ) jQuery.lastModified[url] = modRes;
1706
+
1707
+ // If a local callback was specified, fire it
1708
+ if ( success ) success( xml, status );
1709
+
1710
+ // Fire the global callback
1711
+ jQuery.event.trigger( "ajaxSuccess" );
1712
+
1713
+ // Otherwise, the request was not successful
1714
+ } else {
1715
+ // If a local callback was specified, fire it
1716
+ if ( error ) error( xml, status );
1717
+
1718
+ // Fire the global callback
1719
+ jQuery.event.trigger( "ajaxError" );
1720
+ }
1721
+
1722
+ // The request was completed
1723
+ jQuery.event.trigger( "ajaxComplete" );
1724
+
1725
+ // Handle the global AJAX counter
1726
+ if ( ! --jQuery.active )
1727
+ jQuery.event.trigger( "ajaxStop" );
1728
+
1729
+ // Process result
1730
+ if ( ret ) ret(xml, status);
1731
+
1732
+ // Stop memory leaks
1733
+ xml.onreadystatechange = function(){};
1734
+ xml = null;
1735
+
1736
+ }
1737
+ };
1738
+ xml.onreadystatechange = onreadystatechange;
1739
+
1740
+ // Timeout checker
1741
+ if(jQuery.timeout > 0)
1742
+ setTimeout(function(){
1743
+ // Check to see if the request is still happening
1744
+ if (xml) {
1745
+ // Cancel the request
1746
+ xml.abort();
1747
+
1748
+ if ( !requestDone ) onreadystatechange( "timeout" );
1749
+
1750
+ // Clear from memory
1751
+ xml = null;
1752
+ }
1753
+ }, jQuery.timeout);
1754
+
1755
+ // Send the data
1756
+ xml.send(data);
1757
+ },
1758
+
1759
+ // Counter for holding the number of active queries
1760
+ active: 0,
1761
+
1762
+ // Determines if an XMLHttpRequest was successful or not
1763
+ httpSuccess: function(r) {
1764
+ try {
1765
+ return !r.status && location.protocol == "file:" ||
1766
+ ( r.status >= 200 && r.status < 300 ) || r.status == 304 ||
1767
+ jQuery.browser.safari && r.status == undefined;
1768
+ } catch(e){}
1769
+
1770
+ return false;
1771
+ },
1772
+
1773
+ // Determines if an XMLHttpRequest returns NotModified
1774
+ httpNotModified: function(xml, url) {
1775
+ try {
1776
+ var xmlRes = xml.getResponseHeader("Last-Modified");
1777
+
1778
+ // Firefox always returns 200. check Last-Modified date
1779
+ return xml.status == 304 || xmlRes == jQuery.lastModified[url] ||
1780
+ jQuery.browser.safari && xml.status == undefined;
1781
+ } catch(e){}
1782
+
1783
+ return false;
1784
+ },
1785
+
1786
+ // Get the data out of an XMLHttpRequest.
1787
+ // Return parsed XML if content-type header is "xml" and type is "xml" or omitted,
1788
+ // otherwise return plain text.
1789
+ httpData: function(r,type) {
1790
+ var ct = r.getResponseHeader("content-type");
1791
+ var data = !type && ct && ct.indexOf("xml") >= 0;
1792
+ data = type == "xml" || data ? r.responseXML : r.responseText;
1793
+
1794
+ // If the type is "script", eval it
1795
+ if ( type == "script" ) eval.call( window, data );
1796
+
1797
+ // Get the JavaScript object, if JSON is used.
1798
+ if ( type == "json" ) eval( "data = " + data );
1799
+
1800
+ return data;
1801
+ },
1802
+
1803
+ // Serialize an array of form elements or a set of
1804
+ // key/values into a query string
1805
+ param: function(a) {
1806
+ var s = [];
1807
+
1808
+ // If an array was passed in, assume that it is an array
1809
+ // of form elements
1810
+ if ( a.constructor == Array ) {
1811
+ // Serialize the form elements
1812
+ for ( var i = 0; i < a.length; i++ )
1813
+ s.push( a[i].name + "=" + encodeURIComponent( a[i].value ) );
1814
+
1815
+ // Otherwise, assume that it's an object of key/value pairs
1816
+ } else {
1817
+ // Serialize the key/values
1818
+ for ( var j in a )
1819
+ s.push( j + "=" + encodeURIComponent( a[j] ) );
1820
+ }
1821
+
1822
+ // Return the resulting serialization
1823
+ return s.join("&");
1824
+ }
1825
+
1826
+ });