equipment 1.5.103 → 1.5.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ });