ajax 1.0.8 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/Gemfile +5 -3
  2. data/Gemfile.lock +34 -8
  3. data/README.rdoc +76 -63
  4. data/Rakefile +3 -1
  5. data/VERSION +1 -1
  6. data/app/controllers/ajax_controller.rb +6 -0
  7. data/init.rb +6 -0
  8. data/lib/ajax.rb +13 -24
  9. data/lib/ajax/action_controller.rb +120 -65
  10. data/lib/ajax/application.rb +62 -0
  11. data/lib/ajax/helpers/request_helper.rb +2 -2
  12. data/lib/ajax/helpers/task_helper.rb +2 -2
  13. data/lib/ajax/railtie.rb +25 -1
  14. data/lib/ajax/routes.rb +7 -3
  15. data/lib/ajax/rspec.rb +2 -0
  16. data/lib/ajax/{spec → rspec}/extension.rb +4 -11
  17. data/lib/ajax/{spec → rspec}/helpers.rb +10 -10
  18. data/lib/ajax/rspec/integration.rb +24 -0
  19. data/lib/rack-ajax.rb +1 -1
  20. data/lib/rack-ajax/parser.rb +2 -2
  21. data/public/javascripts/{jquery.address-1.2rc.js → jquery.address-1.3.js} +340 -197
  22. data/public/javascripts/jquery.address-1.3.min.js +32 -0
  23. data/rails/init.rb +1 -4
  24. data/rails/install.rb +1 -1
  25. data/rails/routes.rb +6 -0
  26. data/tasks/ajax_tasks.rake +11 -2
  27. metadata +41 -25
  28. data/app/views/ajax/_redirect_with_fragment.html.erb +0 -19
  29. data/public/javascripts/jquery.address-1.1.js +0 -450
  30. data/public/javascripts/jquery.address-1.1.min.js +0 -11
  31. data/public/javascripts/jquery.address-1.2.js +0 -528
  32. data/public/javascripts/jquery.address-1.2.min.js +0 -25
  33. data/public/javascripts/jquery.address-1.2rc.min.js +0 -27
  34. data/rails/uninstall.rb +0 -1
  35. data/spec/ajax/ajax_spec.rb +0 -23
  36. data/spec/ajax/helpers_spec.rb +0 -121
  37. data/spec/ajax/request_helper_spec.rb +0 -52
  38. data/spec/ajax/tasks_spec.rb +0 -48
  39. data/spec/integration/ajax_spec.rb +0 -146
  40. data/spec/rack-ajax/parser_spec.rb +0 -62
  41. data/spec/spec.opts +0 -1
  42. data/spec/spec_helper.rb +0 -17
  43. data/spec/support/file_macros.rb +0 -28
  44. data/spec/support/query_count.rb +0 -0
  45. data/spec/support/response_helpers.rb +0 -7
@@ -0,0 +1,32 @@
1
+ /*
2
+ * jQuery Address Plugin v1.3
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-09-26 17:58:16 +0300 (Sun, 26 Sep 2010)
10
+ */
11
+ (function(c){c.address=function(){var x=function(a){c(c.address).trigger(c.extend(c.Event(a),function(){for(var b={},f=c.address.parameterNames(),h=0,q=f.length;h<q;h++)b[f[h]]=c.address.parameter(f[h]);return{value:c.address.value(),path:c.address.path(),pathNames:c.address.pathNames(),parameterNames:f,parameters:b,queryString:c.address.queryString()}}.call(c.address)))},y=function(a,b,f){c(c.address).bind(a,b,f);return c.address},A=function(){return z.pushState&&typeof d.state!==t},H=function(){return"/"+
12
+ e.pathname.replace(new RegExp(d.state),"")+e.search+(G()?"#"+G():"")},G=function(){var a=e.href.indexOf("#");return a!=-1?B(e.href.substr(a+1),l):""},u=function(){return A()?H():G()},ra=function(){return"javascript"},$=function(a,b){if(d.strict)a=b?a.substr(0,1)!="/"?"/"+a:a:a==""?"/":a;return a},B=function(a,b){if(d.crawlable&&b)return(a!=""?"!":"")+a;return a.replace(/^\!/,"")},C=function(a,b){return parseInt(a.css(b),10)},aa=function(a){for(var b,f,h=0,q=a.childNodes.length;h<q;h++){if(a.childNodes[h].src)b=
13
+ String(a.childNodes[h].src);if(f=aa(a.childNodes[h]))b=f}return b},M=function(){if(!R){var a=u(),b=g!=a;if(D&&o<523){if(I!=z.length){I=z.length;if(typeof F[I-1]!=t)g=F[I-1];J(l)}}else if(b)if(E&&o<7)e.reload();else{E&&o<8&&d.history&&v(U,50);g=a;J(l)}}},J=function(a){x(ba);x(a?ca:da);v(ea,10)},ea=function(){if(d.tracker!=="null"&&d.tracker!==null){var a=c.isFunction(d.tracker)?d.tracker:j[d.tracker],b=(e.pathname+e.search+(c.address&&!A()?c.address.value():"")).replace(/\/\//,"/").replace(/^\/$/,
14
+ "");if(c.isFunction(a))a(b);else if(c.isFunction(j.urchinTracker))j.urchinTracker(b);else if(typeof j.pageTracker!=t&&c.isFunction(j.pageTracker._trackPageview))j.pageTracker._trackPageview(b);else typeof j._gaq!=t&&c.isFunction(j._gaq.push)&&j._gaq.push(["_trackPageview",b])}},U=function(){var a=ra()+":"+l+";document.open();document.writeln('<html><head><title>"+m.title+"</title><script>var "+p+' = "'+u()+(m.domain!=e.host?'";document.domain="'+m.domain:"")+"\";<\/script></head></html>');document.close();";
15
+ if(o<7)n.src=a;else n.contentWindow.location.replace(a)},ga=function(){if(N&&fa!=-1){var a,b=N.substr(fa+1).split("&");for(r=0;r<b.length;r++){a=b[r].split("=");if(/^(autoUpdate|crawlable|history|strict|wrap)$/.test(a[0]))d[a[0]]=isNaN(a[1])?/^(true|yes)$/i.test(a[1]):parseInt(a[1],10)!==0;if(/^(state|tracker)$/.test(a[0]))d[a[0]]=a[1]}N=null}g=u()},ia=function(){if(!ha){ha=k;ga();var a=c("body").ajaxComplete(function(){sa.call(this);ta.call(this)}).trigger("ajaxComplete");if(d.wrap){c("body > *").wrapAll('<div style="padding:'+
16
+ (C(a,"marginTop")+C(a,"paddingTop"))+"px "+(C(a,"marginRight")+C(a,"paddingRight"))+"px "+(C(a,"marginBottom")+C(a,"paddingBottom"))+"px "+(C(a,"marginLeft")+C(a,"paddingLeft"))+'px;" />').parent().wrap('<div id="'+p+'" style="height:100%; overflow:auto;'+(D?window.statusbar.visible&&!/chrome/i.test(V)?"":" resize:both;":"")+'" />');c("html, body").css({height:"100%",margin:0,padding:0,overflow:"hidden"});D&&c('<style type="text/css" />').appendTo("head").text("#"+p+"::-webkit-resizer { background-color: #fff; }")}if(E&&
17
+ o<8){a=m.getElementsByTagName("frameset")[0];n=m.createElement((a?"":"i")+"frame");if(a){a.insertAdjacentElement("beforeEnd",n);a[a.cols?"cols":"rows"]+=",0";n.noResize=k;n.frameBorder=n.frameSpacing=0}else{n.style.display="none";n.style.width=n.style.height=0;n.tabIndex=-1;m.body.insertAdjacentElement("afterBegin",n)}v(function(){c(n).bind("load",function(){var b=n.contentWindow;g=typeof b[p]!=t?b[p]:"";if(g!=u()){J(l);e.hash=B(g,k)}});typeof n.contentWindow[p]==t&&U()},50)}else if(D){if(o<418){c(m.body).append('<form id="'+
18
+ p+'" style="position:absolute;top:-9999px;" method="get"></form>');W=m.getElementById(p)}if(typeof e[p]==t)e[p]={};if(typeof e[p][e.pathname]!=t)F=e[p][e.pathname].split(",")}v(function(){x("init");J(l)},1);if(!A())if(E&&o>7||!E&&"on"+O in j)if(j.addEventListener)j.addEventListener(O,M,false);else j.attachEvent&&j.attachEvent("on"+O,M);else ua(M,50)}},sa=function(){var a,b=c("a"),f=b.size(),h=-1;v(function(){if(++h!=f){a=c(b.get(h));a.is("[rel*=address:]")&&a.address();v(arguments.callee,1)}},1)},
19
+ va=function(){if(g!=u()){g=u();J(l)}},wa=function(){if(j.removeEventListener)j.removeEventListener(O,M,false);else j.detachEvent&&j.detachEvent("on"+O,M)},ta=function(){var a=e.pathname.replace(/\/$/,"");c("body").html().indexOf("_escaped_fragment_")!=-1&&c("a[href]:not([href^=http]), , a[href*="+document.domain+"]",this).each(function(){var b=c(this).attr("href").replace(/^http:/,"").replace(new RegExp(a+"/?$"),"");if(b==""||b.indexOf("_escaped_fragment_")!=-1)c(this).attr("href","#"+this.decode(b.replace(/\/(.*)\?_escaped_fragment_=(.*)$/,
20
+ "!$2")))})},K=function(a){return encodeURIComponent(a).replace(/%20/g,"+")},ja=function(a){return a.split("#")[0].split("?")[0]},ka=function(a){a=ja(a);var b=a.replace(/\/{2,9}/g,"/").split("/");if(a.substr(0,1)=="/"||a.length===0)b.splice(0,1);a.substr(a.length-1,1)=="/"&&b.splice(b.length-1,1);return b},S=function(a){a=a.split("?");return a.slice(1,a.length).join("?").split("#")[0]},la=function(a,b){if(b=S(b)){params=b.split("&");b=[];for(r=0;r<params.length;r++){var f=params[r].split("=");f[0]==
21
+ a&&b.push(f.slice(1).join("="))}if(b.length!==0)return b.length!=1?b:b[0]}},ma=function(a){var b=S(a);a=[];if(b&&b.indexOf("=")!=-1){b=b.split("&");for(var f=0;f<b.length;f++){var h=b[f].split("=")[0];c.inArray(h,a)==-1&&a.push(h)}}return a},na=function(a){a=a.split("#");return a.slice(1,a.length).join("#")},p="jQueryAddress",t="undefined",O="hashchange",ba="change",ca="internalChange",da="externalChange",k=true,l=false,d={autoUpdate:k,crawlable:l,history:k,strict:k,wrap:l},s=c.browser,o=parseFloat(c.browser.version),
22
+ oa=s.mozilla,E=s.msie,pa=s.opera,D=s.webkit,X=l,j=function(){try{return top.document!==undefined?top:window}catch(a){return window}}(),m=j.document,z=j.history,e=j.location,ua=setInterval,v=setTimeout,V=navigator.userAgent,n,W,N=aa(document),fa=N?N.indexOf("?"):-1,Y=m.title,I=z.length,R=l,ha=l,Z=k,qa=k,T=l,F=[],g=u();if(E){o=parseFloat(V.substr(V.indexOf("MSIE")+4));if(m.documentMode&&m.documentMode!=o)o=m.documentMode!=8?7:8;c(document).bind("propertychange",function(){if(m.title!=Y&&m.title.indexOf("#"+
23
+ u())!=-1)m.title=Y})}if(X=oa&&o>=1||E&&o>=6||pa&&o>=9.5||D&&o>=312){for(var r=1;r<I;r++)F.push("");F.push(g);if(pa)history.navigationMode="compatible";if(document.readyState=="complete")var xa=setInterval(function(){if(c.address){ia();clearInterval(xa)}},50);else{ga();c(ia)}s=H();if(typeof d.state!==t)if(z.pushState)s.substr(0,3)=="/#/"&&e.replace(d.state.replace(/^\/$/,"")+s.substr(2));else s!="/"&&s.replace(/^\/#/,"")!=G()&&e.replace(d.state.replace(/^\/$/,"")+"/#"+s);c(window).bind("popstate",
24
+ va).bind("unload",wa)}else!X&&G()!=""||D&&o<418&&G()!=""&&e.search!=""?e.replace(e.href.substr(0,e.href.indexOf("#"))):ea();return{bind:function(a,b,f){return y(a,b,f)},init:function(a){return y("init",a)},change:function(a){return y(ba,a)},internalChange:function(a){return y(ca,a)},externalChange:function(a){return y(da,a)},baseURL:function(){var a=e.href;if(a.indexOf("#")!=-1)a=a.substr(0,a.indexOf("#"));if(/\/$/.test(a))a=a.substr(0,a.length-1);return a},autoUpdate:function(a){if(a!==undefined){d.autoUpdate=
25
+ a;return this}return d.autoUpdate},crawlable:function(a){if(a!==undefined){d.crawlable=a;return this}return d.crawlable},history:function(a){if(a!==undefined){d.history=a;return this}return d.history},state:function(a){if(a!==undefined){d.state=a;return this}return d.state},strict:function(a){if(a!==undefined){d.strict=a;return this}return d.strict},tracker:function(a){if(a!==undefined){d.tracker=a;return this}return d.tracker},wrap:function(a){if(a!==undefined){d.wrap=a;return this}return d.wrap},
26
+ update:function(){T=k;this.value(g);T=l;return this},encode:function(a){var b=ka(a),f=ma(a),h=S(a),q=na(a),P=a.substr(0,1),L=a.substr(a.length-1),i="";c.each(b,function(w,Q){i+="/"+K(Q)});if(h!==""){i+="?";if(f.length===0)i+=h;else{c.each(f,function(w,Q){w=la(Q,a);if(typeof w!=="string")c.each(w,function(za,ya){i+=K(Q)+"="+K(ya)+"&"});else i+=K(Q)+"="+K(w)+"&"});i=i.substr(0,i.length-1)}}if(q!=="")i+="#"+K(q);if(P!="/"&&i.substr(0,1)=="/")i=i.substr(1);if(/#|&|\?/.test(L))i+=L;return i},decode:function(a){return decodeURIComponent(a.replace(/\+/g,
27
+ "%20"))},title:function(a){if(a!==undefined){v(function(){Y=m.title=a;if(qa&&n&&n.contentWindow&&n.contentWindow.document){n.contentWindow.document.title=a;qa=l}if(!Z&&oa)e.replace(e.href.indexOf("#")!=-1?e.href:e.href+"#");Z=l},50);return this}return m.title},value:function(a){if(a!==undefined){a=$(this.encode(a),k);if(a=="/")a="";if(g==a&&!T)return;Z=k;g=a;if(d.autoUpdate||T){J(k);if(A())z[d.history?"pushState":"replaceState"]({},"",d.state.replace(/\/$/,"")+(g==""?"/":g));else{R=k;F[z.length]=
28
+ g;if(D)if(d.history){e[p][e.pathname]=F.toString();I=z.length+1;if(o<418){if(e.search==""){W.action="#"+B(g,k);W.submit()}}else if(o<523||g==""){a=m.createEvent("MouseEvents");a.initEvent("click",k,k);var b=m.createElement("a");b.href="#"+B(g,k);b.dispatchEvent(a)}else e.hash="#"+B(g,k)}else e.replace("#"+B(g,k));else if(g!=u())if(d.history)e.hash="#"+B(g,k);else e.replace("#"+B(g,k));E&&o<8&&d.history&&v(U,50);if(D)v(function(){R=l},1);else R=l}}return this}if(!X)return null;return $(this.decode(g),
29
+ l)},path:function(a){if(a!==undefined){var b=this.queryString(),f=this.hash();this.value(a+(b?"?"+b:"")+(f?"#"+f:""));return this}return ja(this.value())},pathNames:function(){return ka(this.value())},queryString:function(a){if(a!==undefined){var b=this.hash();this.value(this.path()+(a?"?"+a:"")+(b?"#"+b:""));return this}return S(this.value())},parameter:function(a,b,f){var h,q;if(b!==undefined){var P=this.parameterNames();q=[];for(h=0;h<P.length;h++){var L=P[h],i=this.parameter(L);if(typeof i=="string")i=
30
+ [i];if(L==a)i=b===null||b===""?[]:f?i.concat([b]):[b];for(var w=0;w<i.length;w++)q.push(L+"="+i[w])}c.inArray(a,P)==-1&&b!==null&&b!==""&&q.push(a+"="+b);this.queryString(q.join("&"));return this}return la(a,this.value())},parameterNames:function(){return ma(this.value())},hash:function(a){if(a!==undefined){this.value(this.value().split("#")[0]+(a?"#"+a:""));return this}return na(this.value())}}}();c.fn.address=function(x){if(!c(this).attr("address")){var y=function(A){if(c(this).is("a")){var H=x?
31
+ x.call(this):/address:/.test(c(this).attr("rel"))?c(this).attr("rel").split("address:")[1].split(" ")[0]:typeof c.address.state()!=="undefined"&&c.address.state()!="/"?c(this).attr("href").replace(new RegExp("^(.*"+c.address.state()+"|\\.)"),""):c(this).attr("href").replace(/^(#\!?|\.)/,"");c.address.value(H);A.preventDefault()}};c(this).click(y).live("click",y).submit(function(A){if(c(this).is("form")){var H=x?x.call(this):c(this).attr("action")+"?"+c.address.decode(c(this).serialize());c.address.value(H);
32
+ A.preventDefault()}}).attr("address",true)}return this}})(jQuery);
@@ -1,4 +1 @@
1
- require 'ajax'
2
- require 'rack-ajax'
3
-
4
- Ajax.install_for_rails
1
+ Kernel.load File.expand_path('../../init.rb', __FILE__)
@@ -1,5 +1,5 @@
1
1
  require 'ajax'
2
2
  require 'rake'
3
3
 
4
- load(File.join(Ajax.root, 'tasks', 'ajax_tasks.rake'))
4
+ load(Ajax.root + 'tasks/ajax_tasks.rake')
5
5
  Rake::Task['ajax:install'].invoke
@@ -0,0 +1,6 @@
1
+ if defined?(Rails::Application)
2
+ # Rails3 routes
3
+ Rails.application.routes.draw do
4
+ match Ajax.framework_path, :to => 'ajax#framework', :as => 'ajax_framework'
5
+ end
6
+ end
@@ -8,7 +8,8 @@ namespace :ajax do
8
8
  INSTALL_FILES.map do |file|
9
9
  show_result(file) { |file| copy_unless_exists(file) }
10
10
  end
11
- puts <<-END
11
+ if verbose
12
+ puts <<-END
12
13
  \nWelcome to Ajax!
13
14
 
14
15
  1. Ajax looks for an alternative layout to use with AJAX requests in
@@ -35,12 +36,20 @@ example:
35
36
  });
36
37
  }
37
38
  END
39
+ end
38
40
  end
39
41
 
40
42
  namespace :install do
41
43
  desc "Copy Ajax integration spec tests into spec/integration."
42
44
  task :specs do
43
- puts "Coming soon..."
45
+ file = Ajax.app.root + 'spec/integration/ajax_spec.rb'
46
+ if File.exist?(file)
47
+ puts "already exists: #{file}" if verbose
48
+ else
49
+ FileUtils.mkdir_p(File.dirname(file))
50
+ FileUtils.cp(file.sub(Ajax.app.root, Ajax.root), file)
51
+ puts "created: #{file}" if verbose
52
+ end
44
53
  end
45
54
  end
46
55
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ajax
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 19
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
+ - 1
8
9
  - 0
9
- - 8
10
- version: 1.0.8
10
+ version: 1.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Karl Varga
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-22 00:00:00 -07:00
18
+ date: 2011-04-26 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -32,6 +32,34 @@ dependencies:
32
32
  name: rspec
33
33
  version_requirements: *id001
34
34
  prerelease: false
35
+ - !ruby/object:Gem::Dependency
36
+ type: :runtime
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ hash: 3
43
+ segments:
44
+ - 0
45
+ version: "0"
46
+ name: json
47
+ version_requirements: *id002
48
+ prerelease: false
49
+ - !ruby/object:Gem::Dependency
50
+ type: :runtime
51
+ requirement: &id003 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ hash: 3
57
+ segments:
58
+ - 0
59
+ version: "0"
60
+ name: rack
61
+ version_requirements: *id003
62
+ prerelease: false
35
63
  description: Augment a traditional Rails application with a completely AJAX frontend, while transparently handling issues important to both the enterprise and end users, such as testing, SEO and browser history.
36
64
  email: kjvarga@gmail.com
37
65
  executables: []
@@ -48,12 +76,13 @@ files:
48
76
  - Rakefile
49
77
  - VERSION
50
78
  - app/controllers/ajax_controller.rb
51
- - app/views/ajax/_redirect_with_fragment.html.erb
52
79
  - app/views/ajax/framework.html.erb
53
80
  - config/initializers/ajax.rb
81
+ - init.rb
54
82
  - lib/ajax.rb
55
83
  - lib/ajax/action_controller.rb
56
84
  - lib/ajax/action_view.rb
85
+ - lib/ajax/application.rb
57
86
  - lib/ajax/helpers.rb
58
87
  - lib/ajax/helpers/request_helper.rb
59
88
  - lib/ajax/helpers/robot_helper.rb
@@ -61,36 +90,23 @@ files:
61
90
  - lib/ajax/helpers/url_helper.rb
62
91
  - lib/ajax/railtie.rb
63
92
  - lib/ajax/routes.rb
64
- - lib/ajax/spec/extension.rb
65
- - lib/ajax/spec/helpers.rb
93
+ - lib/ajax/rspec.rb
94
+ - lib/ajax/rspec/extension.rb
95
+ - lib/ajax/rspec/helpers.rb
96
+ - lib/ajax/rspec/integration.rb
66
97
  - lib/ajax/tasks.rb
67
98
  - lib/rack-ajax.rb
68
99
  - lib/rack-ajax/decision_tree.rb
69
100
  - lib/rack-ajax/parser.rb
70
101
  - public/images/ajax-loading.gif
71
102
  - public/javascripts/ajax.js
72
- - public/javascripts/jquery.address-1.1.js
73
- - public/javascripts/jquery.address-1.1.min.js
74
- - public/javascripts/jquery.address-1.2.js
75
- - public/javascripts/jquery.address-1.2.min.js
76
- - public/javascripts/jquery.address-1.2rc.js
77
- - public/javascripts/jquery.address-1.2rc.min.js
103
+ - public/javascripts/jquery.address-1.3.js
104
+ - public/javascripts/jquery.address-1.3.min.js
78
105
  - public/javascripts/jquery.json-2.2.js
79
106
  - public/javascripts/jquery.json-2.2.min.js
80
107
  - rails/init.rb
81
108
  - rails/install.rb
82
- - rails/uninstall.rb
83
- - spec/ajax/ajax_spec.rb
84
- - spec/ajax/helpers_spec.rb
85
- - spec/ajax/request_helper_spec.rb
86
- - spec/ajax/tasks_spec.rb
87
- - spec/integration/ajax_spec.rb
88
- - spec/rack-ajax/parser_spec.rb
89
- - spec/spec.opts
90
- - spec/spec_helper.rb
91
- - spec/support/file_macros.rb
92
- - spec/support/query_count.rb
93
- - spec/support/response_helpers.rb
109
+ - rails/routes.rb
94
110
  - tasks/ajax_tasks.rake
95
111
  has_rdoc: true
96
112
  homepage: http://github.com/kjvarga/ajax
@@ -1,19 +0,0 @@
1
- <%# Locals: url %>
2
- <script type="text/javascript">
3
- var url = <%= url.to_json %>;
4
- var hash = document.location.hash;
5
-
6
- // Remove leading # from the fragment
7
- if (hash.charAt(0) == '#') {
8
- hash = hash.substr(1);
9
- }
10
-
11
- // Remove leading / from the fragment if the URL already ends in a /
12
- // This prevents double-slashes. Note we can't just replace all
13
- // double-slashes because the protocol includes //.
14
- if (url.charAt(url.length - 1) == '/' && hash.charAt(0) == '/') {
15
- hash = hash.substr(1);
16
- }
17
-
18
- document.location.href = url + hash;
19
- </script>
@@ -1,450 +0,0 @@
1
- /*
2
- * jQuery Address Plugin v1.1
3
- * http://www.asual.com/jquery/address/
4
- *
5
- * Copyright (c) 2009 Rostislav Hristov
6
- * Dual licensed under the MIT and GPL licenses.
7
- * http://docs.jquery.com/License
8
- *
9
- * Date: 2009-12-23 14:27:00 +0200 (Wed, 23 Dec 2009)
10
- */
11
- (function ($) {
12
-
13
- $.address = (function () {
14
-
15
- var _trigger = function(name) {
16
- $(this).trigger(
17
- $.extend($.Event(name),
18
- (function() {
19
- var event = {
20
- value: this.value(),
21
- path: this.path(),
22
- pathNames: this.pathNames(),
23
- parameterNames: this.parameterNames(),
24
- parameters: {},
25
- queryString: this.queryString()
26
- };
27
- for (var i = 0, l = event.parameterNames.length; i < l; i++)
28
- event.parameters[event.parameterNames[i]] = this.parameter(event.parameterNames[i]);
29
- return event;
30
- }).call(this)
31
- )
32
- );
33
- };
34
-
35
- var _init = function() {
36
- _trigger.call($.address, 'init');
37
- };
38
-
39
- var _change = function() {
40
- _trigger.call($.address, 'change');
41
- };
42
-
43
- var _getHash = function() {
44
- var index = _l.href.indexOf('#');
45
- return index != -1 ? _ec(_dc(_l.href.substr(index + 1))) : '';
46
- };
47
-
48
- var _getWindow = function() {
49
- try {
50
- return top.document != undefined ? top : window;
51
- } catch (e) {
52
- return window;
53
- }
54
- };
55
-
56
- var _strictCheck = function(value, force) {
57
- if (_opts.strict)
58
- value = force ? (value.substr(0, 1) != '/' ? '/' + value : value) : (value == '' ? '/' : value);
59
- return value;
60
- };
61
-
62
- var _ieLocal = function(value, direction) {
63
- return (_msie && _l.protocol == 'file:') ?
64
- (direction ? _value.replace(/\?/, '%3F') : _value.replace(/%253F/, '?')) : value;
65
- };
66
-
67
- var _searchScript = function(el) {
68
- for (var i = 0, l = el.childNodes.length, s; i < l; i++) {
69
- if (el.childNodes[i].src)
70
- _url = String(el.childNodes[i].src);
71
- if (s = _searchScript(el.childNodes[i]))
72
- return s;
73
- }
74
- };
75
-
76
- var _listen = function() {
77
- if (!_silent) {
78
- var hash = _getHash();
79
- var diff = !(_value == hash);
80
- if (_safari && _version < 523) {
81
- if (_length != _h.length) {
82
- _length = _h.length;
83
- if (typeof _stack[_length - 1] != UNDEFINED)
84
- _value = _stack[_length - 1];
85
- _update(false);
86
- }
87
- } else if (_msie && _version < 7 && diff) {
88
- _l.reload();
89
- } else if (diff) {
90
- _value = hash;
91
- _update(false);
92
- }
93
- }
94
- };
95
-
96
- var _update = function(internal) {
97
- _change();
98
- if (internal) {
99
- _trigger.call($.address, 'internalChange');
100
- } else {
101
- _trigger.call($.address, 'externalChange');
102
- }
103
- _st(_track, 10);
104
- };
105
-
106
- var _track = function() {
107
- var value = (_l.pathname + (/\/$/.test(_l.pathname) ? '' : '/') + _getters.value()).replace(/\/\//, '/').replace(/^\/$/, '');
108
- var fn = window[_opts.tracker];
109
- if (typeof fn == FUNCTION)
110
- fn(value);
111
- else if (typeof pageTracker != UNDEFINED && typeof pageTracker._trackPageview == FUNCTION)
112
- pageTracker._trackPageview(value);
113
- else if (typeof urchinTracker == FUNCTION)
114
- urchinTracker(value);
115
- };
116
-
117
- var _htmlWrite = function() {
118
- var doc = _frame.contentWindow.document;
119
- doc.open();
120
- doc.write('<html><head><title>' + _d.title + '</title><script>var ' + ID + ' = "' + _getHash() + '";</script></head></html>');
121
- doc.close();
122
- };
123
-
124
- var _load = function() {
125
- if (!_loaded) {
126
- _loaded = TRUE;
127
- if (_msie && _version < 8) {
128
- var frameset = _d.getElementsByTagName('frameset')[0];
129
- _frame = _d.createElement((frameset ? '' : 'i') + 'frame');
130
- if (frameset) {
131
- frameset.insertAdjacentElement('beforeEnd', _frame);
132
- frameset[frameset.cols ? 'cols' : 'rows'] += ',0';
133
- _frame.src = 'javascript:false';
134
- _frame.noResize = true;
135
- _frame.frameBorder = _frame.frameSpacing = 0;
136
- } else {
137
- _frame.src = 'javascript:false';
138
- _frame.style.display = 'none';
139
- _d.body.insertAdjacentElement('afterBegin', _frame);
140
- }
141
- _st(function() {
142
- $(_frame).bind('load', function() {
143
- var win = _frame.contentWindow;
144
- var src = win.location.href;
145
- _value = (typeof win[ID] != UNDEFINED ? win[ID] : '');
146
- if (_value != _getHash()) {
147
- _update(false);
148
- _l.hash = _ieLocal(_value, TRUE);
149
- }
150
- });
151
- if (typeof _frame.contentWindow[ID] == UNDEFINED)
152
- _htmlWrite();
153
- }, 50);
154
- } else if (_safari) {
155
- if (_version < 418) {
156
- $(_d.body).append('<form id="' + ID + '" style="position:absolute;top:-9999px;" method="get"></form>');
157
- _form = _d.getElementById(ID);
158
- }
159
- if (typeof _l[ID] == UNDEFINED) _l[ID] = {};
160
- if (typeof _l[ID][_l.pathname] != UNDEFINED) _stack = _l[ID][_l.pathname].split(',');
161
- }
162
-
163
- _st(function() {
164
- _init();
165
- _update(false);
166
- }, 1);
167
-
168
- if (_msie && _version >= 8)
169
- _d.body.onhashchange = _listen;
170
- else
171
- _si(_listen, 50);
172
- $('a[rel*=address:]').address();
173
- }
174
- };
175
-
176
- var _getters = {
177
- baseURL: function() {
178
- var url = _l.href;
179
- if (url.indexOf('#') != -1)
180
- url = url.substr(0, url.indexOf('#'));
181
- if (url.substr(url.length - 1) == '/')
182
- url = url.substr(0, url.length - 1);
183
- return url;
184
- },
185
- strict: function() {
186
- return _opts.strict;
187
- },
188
- history: function() {
189
- return _opts.history;
190
- },
191
- tracker: function() {
192
- return _opts.tracker;
193
- },
194
- title: function() {
195
- return _d.title;
196
- },
197
- value: function() {
198
- if (!_supported) return null;
199
- return _dc(_strictCheck(_ieLocal(_value, FALSE), FALSE));
200
- },
201
- path: function() {
202
- var value = this.value();
203
- return (value.indexOf('?') != -1) ? value.split('?')[0] : value;
204
- },
205
- pathNames: function() {
206
- var path = this.path();
207
- var names = path.split('/');
208
- if (path.substr(0, 1) == '/' || path.length == 0)
209
- names.splice(0, 1);
210
- if (path.substr(path.length - 1, 1) == '/')
211
- names.splice(names.length - 1, 1);
212
- return names;
213
- },
214
- queryString: function() {
215
- var value = this.value();
216
- var index = value.indexOf('?');
217
- if (index != -1 && index < value.length)
218
- return value.substr(index + 1);
219
- },
220
- parameter: function(param) {
221
- var value = this.value();
222
- var index = value.indexOf('?');
223
- if (index != -1) {
224
- value = value.substr(index + 1);
225
- var params = value.split('&');
226
- var p, i = params.length, r = [];
227
- while(i--) {
228
- p = params[i].split('=');
229
- if (p[0] == param)
230
- r.push(p[1]);
231
- }
232
- if (r.length != 0)
233
- return r.length != 1 ? r : r[0];
234
- }
235
- },
236
- parameterNames: function() {
237
- var value = this.value();
238
- var index = value.indexOf('?');
239
- var names = [];
240
- if (index != -1) {
241
- value = value.substr(index + 1);
242
- if (value != '' && value.indexOf('=') != -1) {
243
- var params = value.split('&');
244
- var i = 0;
245
- while(i < params.length) {
246
- names.push(params[i].split('=')[0]);
247
- i++;
248
- }
249
- }
250
- }
251
- return names;
252
- }
253
- };
254
-
255
- var _setters = {
256
- strict: function(strict) {
257
- _opts.strict = strict;
258
- },
259
- history: function(history) {
260
- _opts.history = history;
261
- },
262
- tracker: function(tracker) {
263
- _opts.tracker = tracker;
264
- },
265
- title: function(title) {
266
- title = _dc(title);
267
- _st(function() {
268
- _title = _d.title = title;
269
- if (_juststart && _frame && _frame.contentWindow && _frame.contentWindow.document) {
270
- _frame.contentWindow.document.title = title;
271
- _juststart = FALSE;
272
- }
273
- if (!_justset && _mozilla)
274
- _l.replace(_l.href.indexOf('#') != -1 ? _l.href : _l.href + '#');
275
- _justset = FALSE;
276
- }, 50);
277
- },
278
- value: function(value) {
279
- value = _ec(_dc(_strictCheck(value, TRUE)));
280
- if (value == '/') value = '';
281
- if (_value == value) return;
282
- _justset = TRUE;
283
- _value = value;
284
- _silent = TRUE;
285
- _update(true);
286
- _stack[_h.length] = _value;
287
- if (_safari) {
288
- if (_opts.history) {
289
- _l[ID][_l.pathname] = _stack.toString();
290
- _length = _h.length + 1;
291
- if (_version < 418) {
292
- if (_l.search == '') {
293
- _form.action = '#' + _value;
294
- _form.submit();
295
- }
296
- } else if (_version < 523 || _value == '') {
297
- var evt = _d.createEvent('MouseEvents');
298
- evt.initEvent('click', TRUE, TRUE);
299
- var anchor = _d.createElement('a');
300
- anchor.href = '#' + _value;
301
- anchor.dispatchEvent(evt);
302
- } else {
303
- _l.hash = '#' + _value;
304
- }
305
- } else {
306
- _l.replace('#' + _value);
307
- }
308
- } else if (_value != _getHash()) {
309
- if (_opts.history)
310
- _l.hash = '#' + _ieLocal(_value, TRUE);
311
- else
312
- _l.replace('#' + _value);
313
- }
314
- if ((_msie && _version < 8) && _opts.history) {
315
- _st(_htmlWrite, 50);
316
- }
317
- if (_safari)
318
- _st(function(){ _silent = FALSE; }, 1);
319
- else
320
- _silent = FALSE;
321
- }
322
- };
323
-
324
- var ID = 'jQueryAddress',
325
- FUNCTION = 'function',
326
- UNDEFINED = 'undefined',
327
- TRUE = true,
328
- FALSE = false,
329
- _browser = $.browser,
330
- _version = parseFloat($.browser.version),
331
- _mozilla = _browser.mozilla,
332
- _msie = _browser.msie,
333
- _opera = _browser.opera,
334
- _safari = _browser.safari,
335
- _supported = FALSE,
336
- _t = _getWindow(),
337
- _d = _t.document,
338
- _h = _t.history,
339
- _l = _t.location,
340
- _si = setInterval,
341
- _st = setTimeout,
342
- _dc = decodeURI,
343
- _ec = encodeURI,
344
- _agent = navigator.userAgent,
345
- _frame,
346
- _form,
347
- _url,
348
- _title = _d.title,
349
- _length = _h.length,
350
- _silent = FALSE,
351
- _loaded = FALSE,
352
- _justset = TRUE,
353
- _juststart = TRUE,
354
- _stack = [],
355
- _listeners = {},
356
- _value = _getHash(),
357
- _api = {},
358
- _opts = {history: TRUE, strict: TRUE};
359
-
360
- if (_msie) {
361
- _version = parseFloat(_agent.substr(_agent.indexOf('MSIE') + 4));
362
- if (_d.documentMode && _d.documentMode != _version)
363
- _version = _d.documentMode != 8 ? 7 : 8;
364
- }
365
-
366
- _supported =
367
- (_mozilla && _version >= 1) ||
368
- (_msie && _version >= 6) ||
369
- (_opera && _version >= 9.5) ||
370
- (_safari && _version >= 312);
371
-
372
- if (_supported) {
373
-
374
- for (var i = 1; i < _length; i++)
375
- _stack.push('');
376
-
377
- _stack.push(_getHash());
378
-
379
- if (_msie && _l.hash != _getHash())
380
- _l.hash = '#' + _ieLocal(_getHash(), TRUE);
381
-
382
- if (_opera)
383
- history.navigationMode = 'compatible';
384
-
385
- _searchScript(document);
386
- var _qi = _url.indexOf('?');
387
- if (_url && _qi > -1) {
388
- var param, params = _url.substr(_qi + 1).split('&');
389
- for (var i = 0, p; p = params[i]; i++) {
390
- param = p.split('=');
391
- if (/^(history|strict)$/.test(param[0])) {
392
- _opts[param[0]] = (isNaN(param[1]) ? /^(true|yes)$/i.test(param[1]) : (parseInt(param[1]) != 0));
393
- }
394
- if (/^tracker$/.test(param[0]))
395
- _opts[param[0]] = param[1];
396
- }
397
- }
398
-
399
- $(_load);
400
-
401
- } else if ((!_supported && _l.href.indexOf('#') != -1) ||
402
- (_safari && _version < 418 && _l.href.indexOf('#') != -1 && _l.search != '')){
403
- _d.open();
404
- _d.write('<html><head><meta http-equiv="refresh" content="0;url=' +
405
- _l.href.substr(0, _l.href.indexOf('#')) + '" /></head></html>');
406
- _d.close();
407
- } else {
408
- _track();
409
- }
410
-
411
- $.each(('init,change,internalChange,externalChange').split(','), function(i, name){
412
- _api[name] = function(data, fn){
413
- $($.address).bind(name, fn || data, fn && data);
414
- return this;
415
- };
416
- });
417
-
418
- $.each(('strict,history,tracker,title,value').split(','), function(i, name){
419
- _api[name] = function(value){
420
- if (typeof value != 'undefined') {
421
- if (_supported)
422
- _setters[name](value);
423
- return $.address;
424
- } else {
425
- return _getters[name]();
426
- }
427
- };
428
- });
429
-
430
- $.each(('baseURL,path,pathNames,queryString,parameter,parameterNames').split(','), function(i, name){
431
- _api[name] = function(value){
432
- return _getters[name](value);
433
- };
434
- });
435
-
436
- return _api;
437
-
438
- })();
439
-
440
- $.fn.address = function (fn) {
441
- $(this).click(function() {
442
- var value = fn ? fn.call(this) :
443
- /address:/.test($(this).attr('rel')) ? $(this).attr('rel').split('address:')[1].split(' ')[0] :
444
- $(this).attr('href').replace(/^#/, '');
445
- $.address.value(value);
446
- return false;
447
- });
448
- };
449
-
450
- }(jQuery));