ajax 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.rdoc +291 -0
  3. data/Rakefile +49 -0
  4. data/VERSION +1 -0
  5. data/app/controllers/ajax_controller.rb +3 -0
  6. data/app/views/ajax/framework.html.erb +7 -0
  7. data/config/initializers/ajax.rb +14 -0
  8. data/lib/ajax.rb +79 -0
  9. data/lib/ajax/action_controller.rb +154 -0
  10. data/lib/ajax/action_view.rb +56 -0
  11. data/lib/ajax/helpers.rb +15 -0
  12. data/lib/ajax/helpers/request_helper.rb +76 -0
  13. data/lib/ajax/helpers/robot_helper.rb +31 -0
  14. data/lib/ajax/helpers/url_helper.rb +47 -0
  15. data/lib/ajax/railtie.rb +7 -0
  16. data/lib/ajax/routes.rb +12 -0
  17. data/lib/ajax/spec/extension.rb +34 -0
  18. data/lib/ajax/spec/helpers.rb +95 -0
  19. data/lib/ajax/tasks.rb +1 -0
  20. data/lib/rack-ajax.rb +60 -0
  21. data/lib/rack-ajax/decision_tree.rb +60 -0
  22. data/lib/rack-ajax/parser.rb +115 -0
  23. data/public/images/loading-icon-large.gif +0 -0
  24. data/public/images/loading-icon-small.gif +0 -0
  25. data/public/javascripts/ajax.js +529 -0
  26. data/public/javascripts/jquery.address-1.1.js +450 -0
  27. data/public/javascripts/jquery.address-1.1.min.js +11 -0
  28. data/public/javascripts/jquery.address-1.2.js +528 -0
  29. data/public/javascripts/jquery.address-1.2.min.js +25 -0
  30. data/public/javascripts/jquery.address-1.2rc.js +599 -0
  31. data/public/javascripts/jquery.address-1.2rc.min.js +27 -0
  32. data/public/javascripts/jquery.json-2.2.js +178 -0
  33. data/public/javascripts/jquery.json-2.2.min.js +31 -0
  34. data/rails/init.rb +4 -0
  35. data/rails/install.rb +23 -0
  36. data/rails/uninstall.rb +1 -0
  37. data/spec/ajax/helpers_spec.rb +102 -0
  38. data/spec/ajax/request_helper_spec.rb +33 -0
  39. data/spec/integration/ajax_spec.rb +146 -0
  40. data/spec/rack-ajax/parser_spec.rb +62 -0
  41. data/spec/spec.opts +1 -0
  42. data/spec/spec_helper.rb +18 -0
  43. data/tasks/ajax_tasks.rake +15 -0
  44. metadata +106 -0
@@ -0,0 +1,25 @@
1
+ /*
2
+ * jQuery Address Plugin v1.2
3
+ * http://www.asual.com/jquery/address/
4
+ *
5
+ * Copyright (c) 2009-2010 Rostislav Hristov
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ * http://jquery.org/license
8
+ *
9
+ * Date: 2010-03-03 21:24:30 +0200 (Wed, 03 Mar 2010)
10
+ */
11
+ (function(d){d.address=function(){var z=function(a){d(d.address).trigger(d.extend(d.Event(a),function(){for(var b={},g=d.address.parameterNames(),e=0,p=g.length;e<p;e++)b[g[e]]=d.address.parameter(g[e]);return{value:d.address.value(),path:d.address.path(),pathNames:d.address.pathNames(),parameterNames:g,parameters:b,queryString:d.address.queryString()}}.call(d.address)))},t=function(a,b,g){if(g||b)d(d.address).bind(a,g||b,g&&b);return d.address},u=function(){var a=c.href.indexOf("#");return a!=-1?
12
+ S(H(c.href.substr(a+1))):""},T=function(){return"javascript"},U=function(a,b){if(l.strict)a=b?a.substr(0,1)!="/"?"/"+a:a:a==""?"/":a;return a},I=function(a,b){return s&&c.protocol=="file:"?b?f.replace(/\?/,"%3F"):f.replace(/%253F/,"?"):a},V=function(a){for(var b,g,e=0,p=a.childNodes.length;e<p;e++){if(a.childNodes[e].src)b=String(a.childNodes[e].src);if(g=V(a.childNodes[e]))b=g}return b},F=function(){if(!J){var a=u(),b=f!=a;if(A&&m<523){if(B!=D.length){B=D.length;if(typeof v[B-1]!=w)f=v[B-1];E(h)}}else if(s&&
13
+ m<7&&b)c.reload();else if(b){f=a;E(h)}}},E=function(a){z("change");z(a?"internalChange":"externalChange");C(W,10)},W=function(){var a=(c.pathname+(/\/$/.test(c.pathname)?"":"/")+d.address.value()).replace(/\/\//,"/").replace(/^\/$/,""),b=window[l.tracker];if(typeof b==K)b(a);else if(typeof _gaq!=w&&typeof _gaq.push==K)_gaq.push(["_trackPageview",a]);else if(typeof pageTracker!=w&&typeof pageTracker._trackPageview==K)pageTracker._trackPageview(a);else typeof urchinTracker==K&&urchinTracker(a)},X=function(){var a=
14
+ i.contentWindow.document;a.open();a.write("<html><head><title>"+j.title+"</title><script>var "+q+' = "'+u()+'";<\/script></head></html>');a.close()},Z=function(){if(!Y){Y=k;if(s&&m<8){var a=j.getElementsByTagName("frameset")[0];i=j.createElement((a?"":"i")+"frame");if(a){a.insertAdjacentElement("beforeEnd",i);a[a.cols?"cols":"rows"]+=",0";i.src=T()+":"+h;i.noResize=k;i.frameBorder=i.frameSpacing=0}else{i.src=T()+":"+h;i.style.display="none";j.body.insertAdjacentElement("afterBegin",i)}C(function(){d(i).bind("load",
15
+ function(){var b=i.contentWindow;f=typeof b[q]!=w?b[q]:"";if(f!=u()){E(h);c.hash=I(f,k)}});typeof i.contentWindow[q]==w&&X()},50)}else if(A){if(m<418){d(j.body).append('<form id="'+q+'" style="position:absolute;top:-9999px;" method="get"></form>');M=j.getElementById(q)}if(typeof c[q]==w)c[q]={};if(typeof c[q][c.pathname]!=w)v=c[q][c.pathname].split(",")}C(function(){z("init");E(h)},1);if(s&&m>7||!s&&"on"+G in o)if(o.addEventListener)o.addEventListener(G,F,false);else o.attachEvent&&o.attachEvent("on"+
16
+ G,F);else ca(F,50);d("a[rel*=address:]").address()}},da=function(){if(o.removeEventListener)o.removeEventListener(G,F,false);else o.detachEvent&&o.detachEvent("on"+G,F)},q="jQueryAddress",K="function",w="undefined",G="hashchange",k=true,h=false,n=d.browser,m=parseFloat(d.browser.version),$=n.mozilla,s=n.msie,r=n.opera,A=n.safari,N=h,o=function(){try{return top.document!==undefined?top:window}catch(a){return window}}(),j=o.document,D=o.history,c=o.location,ca=setInterval,C=setTimeout,H=decodeURI,S=
17
+ encodeURI;n=navigator.userAgent;var i,M,x=V(document),aa=x?x.indexOf("?"):-1,ea=j.title,B=D.length,J=h,Y=h,O=k,ba=k,L=h,v=[],f=u(),l={autoUpdate:k,history:k,strict:k};if(s){m=parseFloat(n.substr(n.indexOf("MSIE")+4));if(j.documentMode&&j.documentMode!=m)m=j.documentMode!=8?7:8}if(N=$&&m>=1||s&&m>=6||r&&m>=9.5||A&&m>=312){for(n=1;n<B;n++)v.push("");v.push(f);if(s&&c.hash!=f)c.hash="#"+I(f,k);if(r)history.navigationMode="compatible";if(x&&aa!=-1){x=x.substr(aa+1).split("&");for(n=0;n<x.length;n++){r=
18
+ x[n].split("=");if(/^(autoUpdate|history|strict)$/.test(r[0]))l[r[0]]=isNaN(r[1])?/^(true|yes)$/i.test(r[1]):parseInt(r[1],10)!==0;if(/^tracker$/.test(r[0]))l[r[0]]=r[1]}}document.readyState=="complete"&&Z();d(Z);d(window).bind("unload",da)}else if(!N&&c.href.indexOf("#")!=-1||A&&m<418&&c.href.indexOf("#")!=-1&&c.search!=""){j.open();j.write('<html><head><meta http-equiv="refresh" content="0;url='+c.href.substr(0,c.href.indexOf("#"))+'" /></head></html>');j.close()}else W();return{init:function(a,
19
+ b){return t("init",a,b)},change:function(a,b){return t("change",a,b)},internalChange:function(a,b){return t("internalChange",a,b)},externalChange:function(a,b){return t("externalChange",a,b)},baseURL:function(){var a=c.href;if(a.indexOf("#")!=-1)a=a.substr(0,a.indexOf("#"));if(a.substr(a.length-1)=="/")a=a.substr(0,a.length-1);return a},strict:function(a){if(a!==undefined){l.strict=a;return this}return l.strict},autoUpdate:function(a){if(a!==undefined){l.autoUpdate=a;return this}return l.autoUpdate},
20
+ update:function(){L=k;this.value(f);L=h;return this},history:function(a){if(a!==undefined){l.history=a;return this}return l.history},tracker:function(a){if(a!==undefined){l.tracker=a;return this}return l.tracker},title:function(a){if(a!==undefined){a=H(a);C(function(){ea=j.title=a;if(ba&&i&&i.contentWindow&&i.contentWindow.document){i.contentWindow.document.title=a;ba=h}if(!O&&$)c.replace(c.href.indexOf("#")!=-1?c.href:c.href+"#");O=h},50);return this}return j.title},value:function(a){if(a!==undefined){a=
21
+ S(H(U(a,k)));if(a=="/")a="";if(f==a&&!L)return;O=k;f=a;if(l.autoUpdate||L){J=k;E(k);v[D.length]=f;if(A)if(l.history){c[q][c.pathname]=v.toString();B=D.length+1;if(m<418){if(c.search==""){M.action="#"+f;M.submit()}}else if(m<523||f==""){a=j.createEvent("MouseEvents");a.initEvent("click",k,k);var b=j.createElement("a");b.href="#"+f;b.dispatchEvent(a)}else c.hash="#"+f}else c.replace("#"+f);else if(f!=u())if(l.history)c.hash="#"+I(f,k);else c.replace("#"+f);s&&m<8&&l.history&&C(X,50);if(A)C(function(){J=
22
+ h},1);else J=h}return this}if(!N)return null;return H(U(I(f,h),h))},path:function(a){if(a!==undefined){var b=this.queryString();this.value(a+(b?"?"+b:""));return this}a=this.value();return a.indexOf("?")!=-1?a.split("?")[0]:a},queryString:function(a){if(a!==undefined){this.value(this.path()+(a?"?"+a:""));return this}a=this.value();var b=a.indexOf("?");if(b!=-1&&b<a.length)return a.substr(b+1)},parameter:function(a,b,g){var e,p;if(b!==undefined){var P=this.parameterNames();p=[];for(e=0;e<P.length;e++){var Q=
23
+ P[e],y=this.parameter(Q);if(typeof y=="string")y=[y];if(Q==a)y=b===null||b==""?[]:g?y.concat([b]):[b];for(var R=0;R<y.length;R++)p.push(Q+"="+y[R])}d.inArray(a,P)==-1&&p.push(a+"="+b);this.queryString(p.join("&"));return this}b=this.value();e=b.indexOf("?");if(e!=-1){b=b.substr(e+1);p=b.split("&");b=[];for(e=0;e<p.length;e++){g=p[e].split("=");g[0]==a&&b.push(g[1])}if(b.length!==0)return b.length!=1?b:b[0]}},pathNames:function(){var a=this.path(),b=a.split("/");if(a.substr(0,1)=="/"||a.length===0)b.splice(0,
24
+ 1);a.substr(a.length-1,1)=="/"&&b.splice(b.length-1,1);return b},parameterNames:function(){var a=this.value(),b=a.indexOf("?"),g=[];if(b!=-1){a=a.substr(b+1);if(a!=""&&a.indexOf("=")!=-1){a=a.split("&");for(b=0;b<a.length;b++){var e=a[b].split("=")[0];d.inArray(e,g)==-1&&g.push(e)}}}return g}}}();d.fn.address=function(z){var t=function(){var u=z?z.call(this):/address:/.test(d(this).attr("rel"))?d(this).attr("rel").split("address:")[1].split(" ")[0]:d(this).attr("href").replace(/^#/,"");d.address.value(u);
25
+ return false};d(this).click(t).live("click",t)}})(jQuery);
@@ -0,0 +1,599 @@
1
+ /*
2
+ * jQuery Address Plugin v1.2rc
3
+ * http://www.asual.com/jquery/address/
4
+ *
5
+ * Copyright (c) 2009-2010 Rostislav Hristov
6
+ * Dual licensed under the MIT or GPL Version 2 licenses.
7
+ * http://jquery.org/license
8
+ *
9
+ * Date: 2010-03-31 11:35:36 +0300 (Wed, 31 Mar 2010)
10
+ */
11
+ (function ($) {
12
+
13
+ $.address = (function () {
14
+
15
+ var _trigger = function(name) {
16
+ $($.address).trigger(
17
+ $.extend($.Event(name),
18
+ (function() {
19
+ var parameters = {},
20
+ parameterNames = $.address.parameterNames();
21
+ for (var i = 0, l = parameterNames.length; i < l; i++) {
22
+ parameters[parameterNames[i]] = $.address.parameter(parameterNames[i]);
23
+ }
24
+ return {
25
+ value: $.address.value(),
26
+ path: $.address.path(),
27
+ pathNames: $.address.pathNames(),
28
+ parameterNames: parameterNames,
29
+ parameters: parameters,
30
+ queryString: $.address.queryString()
31
+ };
32
+ }).call($.address)
33
+ )
34
+ );
35
+ },
36
+ _bind = function(value, data, fn) {
37
+ if (fn || data) {
38
+ $($.address).bind(value, fn || data, fn && data);
39
+ }
40
+ return $.address;
41
+ },
42
+ _hash = function() {
43
+ var index = _l.href.indexOf('#');
44
+ return index != -1 ? _ec(_dc(_crawl(_l.href.substr(index + 1), FALSE))) : '';
45
+ },
46
+ _window = function() {
47
+ try {
48
+ return top.document !== undefined ? top : window;
49
+ } catch (e) {
50
+ return window;
51
+ }
52
+ },
53
+ _js = function() {
54
+ return 'javascript';
55
+ },
56
+ _strict = function(value, force) {
57
+ if (_opts.strict) {
58
+ value = force ? (value.substr(0, 1) != '/' ? '/' + value : value) : (value == '' ? '/' : value);
59
+ }
60
+ return value;
61
+ },
62
+ _local = function(value, direction) {
63
+ return (_msie && _l.protocol == 'file:') ?
64
+ (direction ? _value.replace(/\?/, '%3F') : _value.replace(/%253F/, '?')) : value;
65
+ },
66
+ _crawl = function(value, direction) {
67
+ if (_opts.crawlable && direction) {
68
+ return (value != '' ? '!' : '') + value;
69
+ }
70
+ return value.replace(/^\!/, '');
71
+ },
72
+ _cssint = function(el, value) {
73
+ return parseInt(el.css(value), 10);
74
+ },
75
+ _search = function(el) {
76
+ var url, s;
77
+ for (var i = 0, l = el.childNodes.length; i < l; i++) {
78
+ if (el.childNodes[i].src) {
79
+ url = String(el.childNodes[i].src);
80
+ }
81
+ s = _search(el.childNodes[i]);
82
+ if (s) {
83
+ url = s;
84
+ }
85
+ }
86
+ return url;
87
+ },
88
+ _listen = function() {
89
+ if (!_silent) {
90
+ var hash = _hash(),
91
+ diff = _value != hash;
92
+ if (_safari && _version < 523) {
93
+ if (_length != _h.length) {
94
+ _length = _h.length;
95
+ if (typeof _stack[_length - 1] != UNDEFINED) {
96
+ _value = _stack[_length - 1];
97
+ }
98
+ _update(FALSE);
99
+ }
100
+ } else if (_msie && _version < 7 && diff) {
101
+ _l.reload();
102
+ } else if (diff) {
103
+ _value = hash;
104
+ _update(FALSE);
105
+ }
106
+ }
107
+ },
108
+ _update = function(internal) {
109
+ _trigger(CHANGE);
110
+ _trigger(internal ? INTERNAL_CHANGE : EXTERNAL_CHANGE);
111
+ _st(_track, 10);
112
+ },
113
+ _track = function() {
114
+ var value = (_l.pathname + (/\/$/.test(_l.pathname) ? '' : '/') + $.address.value()).replace(/\/\//, '/').replace(/^\/$/, ''),
115
+ fn = window[_opts.tracker];
116
+ if (typeof fn == FUNCTION) {
117
+ fn(value);
118
+ } else if (typeof _gaq != UNDEFINED && typeof _gaq.push == FUNCTION) {
119
+ _gaq.push(['_trackPageview', value]);
120
+ } else if (typeof pageTracker != UNDEFINED && typeof pageTracker._trackPageview == FUNCTION) {
121
+ pageTracker._trackPageview(value);
122
+ } else if (typeof urchinTracker == FUNCTION) {
123
+ urchinTracker(value);
124
+ }
125
+ },
126
+ _html = function() {
127
+ var doc = _frame.contentWindow.document;
128
+ doc.open();
129
+ doc.write('<html><head><title>' + _d.title + '</title><script>var ' + ID + ' = "' + _hash() + '";</' + 'script></head></html>');
130
+ doc.close();
131
+ },
132
+ _load = function() {
133
+ if (!_loaded) {
134
+ _loaded = TRUE;
135
+ if (_opts.wrap) {
136
+ var body = $('body');
137
+ wrap = $('body > *')
138
+ .wrapAll('<div style="padding:' +
139
+ (_cssint(body, 'marginTop') + _cssint(body, 'paddingTop')) + 'px ' +
140
+ (_cssint(body, 'marginRight') + _cssint(body, 'paddingRight')) + 'px ' +
141
+ (_cssint(body, 'marginBottom') + _cssint(body, 'paddingBottom')) + 'px ' +
142
+ (_cssint(body, 'marginLeft') + _cssint(body, 'paddingLeft')) + 'px;" />')
143
+ .parent()
144
+ .wrap('<div id="' + ID + '" style="height:100%; overflow:auto;' +
145
+ (_safari ? (window.statusbar.visible && !/chrome/i.test(_agent) ? '' : ' resize:both;') : '') + '" />');
146
+ $('html, body')
147
+ .css({
148
+ height: '100%',
149
+ margin: 0,
150
+ padding: 0,
151
+ overflow: 'hidden'
152
+ });
153
+ if (_safari) {
154
+ $('<style type="text/css" />')
155
+ .appendTo('head')
156
+ .text('#' + ID + '::-webkit-resizer { background-color: #fff; }');
157
+ }
158
+ }
159
+ if (_msie && _version < 8) {
160
+ var frameset = _d.getElementsByTagName('frameset')[0];
161
+ _frame = _d.createElement((frameset ? '' : 'i') + 'frame');
162
+ if (frameset) {
163
+ frameset.insertAdjacentElement('beforeEnd', _frame);
164
+ frameset[frameset.cols ? 'cols' : 'rows'] += ',0';
165
+ _frame.src = _js() + ':' + FALSE;
166
+ _frame.noResize = TRUE;
167
+ _frame.frameBorder = _frame.frameSpacing = 0;
168
+ } else {
169
+ _frame.src = _js() + ':' + FALSE;
170
+ _frame.style.display = 'none';
171
+ _d.body.insertAdjacentElement('afterBegin', _frame);
172
+ }
173
+ _st(function() {
174
+ $(_frame).bind('load', function() {
175
+ var win = _frame.contentWindow;
176
+ var src = win.location.href;
177
+ _value = (typeof win[ID] != UNDEFINED ? win[ID] : '');
178
+ if (_value != _hash()) {
179
+ _update(FALSE);
180
+ _l.hash = _local(_crawl(_value, TRUE), TRUE);
181
+ }
182
+ });
183
+ if (typeof _frame.contentWindow[ID] == UNDEFINED) {
184
+ _html();
185
+ }
186
+ }, 50);
187
+ } else if (_safari) {
188
+ if (_version < 418) {
189
+ $(_d.body).append('<form id="' + ID + '" style="position:absolute;top:-9999px;" method="get"></form>');
190
+ _form = _d.getElementById(ID);
191
+ }
192
+ if (typeof _l[ID] == UNDEFINED) {
193
+ _l[ID] = {};
194
+ }
195
+ if (typeof _l[ID][_l.pathname] != UNDEFINED) {
196
+ _stack = _l[ID][_l.pathname].split(',');
197
+ }
198
+ }
199
+
200
+ _st(function() {
201
+ _trigger('init');
202
+ _update(FALSE);
203
+ }, 1);
204
+
205
+ if ((_msie && _version > 7) || (!_msie && ('on' + HASH_CHANGE) in _t)) {
206
+ if (_t.addEventListener) {
207
+ _t.addEventListener(HASH_CHANGE, _listen, false);
208
+ } else if (_t.attachEvent) {
209
+ _t.attachEvent('on' + HASH_CHANGE, _listen);
210
+ }
211
+ } else {
212
+ _si(_listen, 50);
213
+ }
214
+ $('a[rel*=address:]').address();
215
+ }
216
+ },
217
+ _unload = function() {
218
+ if (_t.removeEventListener) {
219
+ _t.removeEventListener(HASH_CHANGE, _listen, false);
220
+ } else if (_t.detachEvent) {
221
+ _t.detachEvent('on' + HASH_CHANGE, _listen);
222
+ }
223
+ },
224
+ ID = 'jQueryAddress',
225
+ FUNCTION = 'function',
226
+ UNDEFINED = 'undefined',
227
+ HASH_CHANGE = 'hashchange',
228
+ INIT = 'init',
229
+ CHANGE = 'change',
230
+ INTERNAL_CHANGE = 'internalChange',
231
+ EXTERNAL_CHANGE = 'externalChange',
232
+ TRUE = true,
233
+ FALSE = false,
234
+ _opts = {
235
+ autoUpdate: TRUE,
236
+ crawlable: FALSE,
237
+ history: TRUE,
238
+ strict: TRUE,
239
+ wrap: FALSE
240
+ },
241
+ _browser = $.browser,
242
+ _version = parseFloat($.browser.version),
243
+ _mozilla = _browser.mozilla,
244
+ _msie = _browser.msie,
245
+ _opera = _browser.opera,
246
+ _safari = _browser.safari,
247
+ _supported = FALSE,
248
+ _t = _window(),
249
+ _d = _t.document,
250
+ _h = _t.history,
251
+ _l = _t.location,
252
+ _si = setInterval,
253
+ _st = setTimeout,
254
+ _dc = decodeURI,
255
+ _ec = encodeURI,
256
+ _agent = navigator.userAgent,
257
+ _frame,
258
+ _form,
259
+ _url = _search(document),
260
+ _qi = _url ? _url.indexOf('?') : -1,
261
+ _title = _d.title,
262
+ _length = _h.length,
263
+ _silent = FALSE,
264
+ _loaded = FALSE,
265
+ _justset = TRUE,
266
+ _juststart = TRUE,
267
+ _updating = FALSE,
268
+ _stack = [],
269
+ _listeners = {},
270
+ _value = _hash();
271
+
272
+ if (_msie) {
273
+ _version = parseFloat(_agent.substr(_agent.indexOf('MSIE') + 4));
274
+ if (_d.documentMode && _d.documentMode != _version) {
275
+ _version = _d.documentMode != 8 ? 7 : 8;
276
+ }
277
+ $(document).bind('propertychange', function() {
278
+ if (_d.title != _title && _d.title.indexOf('#' + _hash()) != -1) {
279
+ _d.title = _title;
280
+ }
281
+ });
282
+ }
283
+
284
+ _supported =
285
+ (_mozilla && _version >= 1) ||
286
+ (_msie && _version >= 6) ||
287
+ (_opera && _version >= 9.5) ||
288
+ (_safari && _version >= 312);
289
+
290
+ if (_supported) {
291
+
292
+ for (var i = 1; i < _length; i++) {
293
+ _stack.push('');
294
+ }
295
+
296
+ _stack.push(_value);
297
+
298
+ if (_msie && _l.hash != _value) {
299
+ _l.hash = '#' + _local(_crawl(_value, TRUE), TRUE);
300
+ }
301
+
302
+ if (_opera) {
303
+ history.navigationMode = 'compatible';
304
+ }
305
+
306
+ if (_url && _qi != -1) {
307
+ var param, params = _url.substr(_qi + 1).split('&');
308
+ for (i = 0; i < params.length; i++) {
309
+ param = params[i].split('=');
310
+ if (/^(autoUpdate|crawlable|history|strict|wrap)$/.test(param[0])) {
311
+ _opts[param[0]] = (isNaN(param[1]) ? /^(true|yes)$/i.test(param[1]) : (parseInt(param[1], 10) !== 0));
312
+ }
313
+ if (/^tracker$/.test(param[0])) {
314
+ _opts[param[0]] = param[1];
315
+ }
316
+ }
317
+ }
318
+
319
+ if (document.readyState == 'complete') {
320
+ _load();
321
+ }
322
+ $(_load);
323
+ $(window).bind('unload', _unload);
324
+
325
+ } else if ((!_supported && _hash() != '') ||
326
+ (_safari && _version < 418 && _hash() != '' && _l.search != '')) {
327
+ _d.open();
328
+ _d.write('<html><head><meta http-equiv="refresh" content="0;url=' +
329
+ encodeURI(_l.href.substr(0, _l.href.indexOf('#'))) + '" /></head></html>');
330
+ _d.close();
331
+ } else {
332
+ _track();
333
+ }
334
+
335
+ return {
336
+ init: function(data, fn) {
337
+ return _bind(INIT, data, fn);
338
+ },
339
+ change: function(data, fn) {
340
+ return _bind(CHANGE, data, fn);
341
+ },
342
+ internalChange: function(data, fn) {
343
+ return _bind(INTERNAL_CHANGE, data, fn);
344
+ },
345
+ externalChange: function(data, fn) {
346
+ return _bind(EXTERNAL_CHANGE, data, fn);
347
+ },
348
+ baseURL: function() {
349
+ var url = _l.href;
350
+ if (_hash() != '') {
351
+ url = url.substr(0, url.indexOf('#'));
352
+ }
353
+ if (/\/$/.test(url)) {
354
+ url = url.substr(0, url.length - 1);
355
+ }
356
+ return url;
357
+ },
358
+ autoUpdate: function(value) {
359
+ if (value !== undefined) {
360
+ _opts.autoUpdate = value;
361
+ return this;
362
+ }
363
+ return _opts.autoUpdate;
364
+ },
365
+ crawlable: function(value) {
366
+ if (value !== undefined) {
367
+ _opts.crawlable = value;
368
+ return this;
369
+ }
370
+ return _opts.crawlable;
371
+ },
372
+ history: function(value) {
373
+ if (value !== undefined) {
374
+ _opts.history = value;
375
+ return this;
376
+ }
377
+ return _opts.history;
378
+ },
379
+ strict: function(value) {
380
+ if (value !== undefined) {
381
+ _opts.strict = value;
382
+ return this;
383
+ }
384
+ return _opts.strict;
385
+ },
386
+ tracker: function(value) {
387
+ if (value !== undefined) {
388
+ _opts.tracker = value;
389
+ return this;
390
+ }
391
+ return _opts.tracker;
392
+ },
393
+ wrap: function(value) {
394
+ if (value !== undefined) {
395
+ _opts.wrap = value;
396
+ return this;
397
+ }
398
+ return _opts.wrap;
399
+ },
400
+ update: function() {
401
+ _updating = TRUE;
402
+ this.value(_value);
403
+ _updating = FALSE;
404
+ return this;
405
+ },
406
+ title: function(value) {
407
+ if (value !== undefined) {
408
+ value = _dc(value);
409
+ _st(function() {
410
+ _title = _d.title = value;
411
+ if (_juststart && _frame && _frame.contentWindow && _frame.contentWindow.document) {
412
+ _frame.contentWindow.document.title = value;
413
+ _juststart = FALSE;
414
+ }
415
+ if (!_justset && _mozilla) {
416
+ _l.replace(_l.href.indexOf('#') != -1 ? _l.href : _l.href + '#');
417
+ }
418
+ _justset = FALSE;
419
+ }, 50);
420
+ return this;
421
+ }
422
+ return _d.title;
423
+ },
424
+ value: function(value) {
425
+ if (value !== undefined) {
426
+ value = _ec(_dc(_strict(value, TRUE)));
427
+ if (value == '/') {
428
+ value = '';
429
+ }
430
+ if (_value == value && !_updating) {
431
+ return;
432
+ }
433
+ _justset = TRUE;
434
+ _value = value;
435
+ if (_opts.autoUpdate || _updating) {
436
+ _silent = TRUE;
437
+ _update(TRUE);
438
+ _stack[_h.length] = _value;
439
+ if (_safari) {
440
+ if (_opts.history) {
441
+ _l[ID][_l.pathname] = _stack.toString();
442
+ _length = _h.length + 1;
443
+ if (_version < 418) {
444
+ if (_l.search == '') {
445
+ _form.action = '#' + _crawl(_value, TRUE);
446
+ _form.submit();
447
+ }
448
+ } else if (_version < 523 || _value == '') {
449
+ var evt = _d.createEvent('MouseEvents');
450
+ evt.initEvent('click', TRUE, TRUE);
451
+ var anchor = _d.createElement('a');
452
+ anchor.href = '#' + _crawl(_value, TRUE);
453
+ anchor.dispatchEvent(evt);
454
+ } else {
455
+ _l.hash = '#' + _crawl(_value, TRUE);
456
+ }
457
+ } else {
458
+ _l.replace('#' + _crawl(_value, TRUE));
459
+ }
460
+ } else if (_value != _hash()) {
461
+ if (_opts.history) {
462
+ _l.hash = '#' + _local(_crawl(_value, TRUE), TRUE);
463
+ } else {
464
+ _l.replace('#' + _crawl(_value, TRUE));
465
+ }
466
+ }
467
+ if ((_msie && _version < 8) && _opts.history) {
468
+ _st(_html, 50);
469
+ }
470
+ if (_safari) {
471
+ _st(function(){ _silent = FALSE; }, 1);
472
+ } else {
473
+ _silent = FALSE;
474
+ }
475
+ }
476
+ return this;
477
+ }
478
+ if (!_supported) {
479
+ return null;
480
+ }
481
+ return _dc(_strict(_local(_value, FALSE), FALSE));
482
+ },
483
+ path: function(value) {
484
+ if (value !== undefined) {
485
+ var qs = this.queryString(),
486
+ hash = this.hash();
487
+ this.value(value + (qs ? '?' + qs : '') + (hash ? '#' + hash : ''));
488
+ return this;
489
+ }
490
+ return this.value().split('#')[0].split('?')[0];
491
+ },
492
+ queryString: function(value) {
493
+ if (value !== undefined) {
494
+ var hash = this.hash();
495
+ this.value(this.path() + (value ? '?' + value : '') + (hash ? '#' + hash : ''));
496
+ return this;
497
+ }
498
+ var arr = this.value().split('?');
499
+ return arr.slice(1, arr.length).join('?').split('#')[0];
500
+ },
501
+ parameter: function(name, value, append) {
502
+ var i, params;
503
+ if (value !== undefined) {
504
+ var names = this.parameterNames();
505
+ params = [];
506
+ for (i = 0; i < names.length; i++) {
507
+ var n = names[i],
508
+ v = this.parameter(n);
509
+ if (typeof v == 'string') {
510
+ v = [v];
511
+ }
512
+ if (n == name) {
513
+ v = (value === null || value == '') ? [] :
514
+ (append ? v.concat([value]) : [value]);
515
+ }
516
+ for (var j = 0; j < v.length; j++) {
517
+ params.push(n + '=' + v[j]);
518
+ }
519
+ }
520
+ if ($.inArray(name, names) == -1) {
521
+ params.push(name + '=' + value);
522
+ }
523
+ this.queryString(params.join('&'));
524
+ return this;
525
+ }
526
+ value = this.queryString();
527
+ if (value) {
528
+ params = value.split('&');
529
+ var r = [];
530
+ for (i = 0; i < params.length; i++) {
531
+ var p = params[i].split('=');
532
+ if (p[0] == name) {
533
+ r.push(p[1]);
534
+ }
535
+ }
536
+ if (r.length !== 0) {
537
+ return r.length != 1 ? r : r[0];
538
+ }
539
+ }
540
+ },
541
+ pathNames: function() {
542
+ var path = this.path(),
543
+ names = path.replace(/\/{2,9}/g, '/').split('/');
544
+ if (path.substr(0, 1) == '/' || path.length === 0) {
545
+ names.splice(0, 1);
546
+ }
547
+ if (path.substr(path.length - 1, 1) == '/') {
548
+ names.splice(names.length - 1, 1);
549
+ }
550
+ return names;
551
+ },
552
+ parameterNames: function() {
553
+ var qs = this.queryString(),
554
+ names = [];
555
+ if (qs && qs.indexOf('=') != -1) {
556
+ var params = qs.split('&');
557
+ for (var i = 0; i < params.length; i++) {
558
+ var name = params[i].split('=')[0];
559
+ if ($.inArray(name, names) == -1) {
560
+ names.push(name);
561
+ }
562
+ }
563
+ }
564
+ return names;
565
+ },
566
+ hash: function(value) {
567
+ if (value !== undefined) {
568
+ this.value(this.value().split('#')[0] + (value ? '#' + value : ''));
569
+ return this;
570
+ }
571
+ var arr = this.value().split('#');
572
+ return arr.slice(1, arr.length).join('#');
573
+ }
574
+ };
575
+
576
+ })();
577
+
578
+ $.fn.address = function (fn) {
579
+ this.each(function() {
580
+ if (this.tagName.toLowerCase() == 'form') {
581
+ $('form').live('submit', function() {
582
+ var value = fn ? fn.call(this) : $(this).attr('action') + '?' + $(this).serialize();
583
+ $.address.value(value);
584
+ return false;
585
+ });
586
+ } else {
587
+ var f = function() {
588
+ var value = fn ? fn.call(this) :
589
+ /address:/.test($(this).attr('rel')) ? $(this).attr('rel').split('address:')[1].split(' ')[0] :
590
+ $(this).attr('href').replace(/^#\!?/, '');
591
+ $.address.value(value);
592
+ return false;
593
+ };
594
+ $(this).click(f).live('click', f);
595
+ }
596
+ });
597
+ };
598
+
599
+ }(jQuery));