ajax 1.0.8 → 1.1.0

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.
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));