neat-pages 0.1.7 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.travis.yml +4 -0
  4. data/Gemfile +2 -0
  5. data/LICENSE +1 -1
  6. data/README.md +58 -22
  7. data/app/assets/javascripts/neat_pages/base.coffee +8 -1
  8. data/lib/.reek +12 -0
  9. data/lib/neat-pages.rb +2 -1
  10. data/lib/neat_pages/base.rb +5 -7
  11. data/lib/neat_pages/engine.rb +3 -1
  12. data/lib/neat_pages/errors.rb +9 -0
  13. data/lib/neat_pages/helpers.rb +8 -10
  14. data/lib/neat_pages/helpers/builder.rb +26 -16
  15. data/lib/neat_pages/helpers/navigation.rb +39 -27
  16. data/lib/neat_pages/helpers/status.rb +14 -0
  17. data/lib/neat_pages/implants/action_controller_implant.rb +3 -0
  18. data/lib/neat_pages/implants/mongoid_implant.rb +12 -10
  19. data/lib/neat_pages/{implants/railtie.rb → railtie.rb} +7 -4
  20. data/neat-pages.gemspec +23 -0
  21. data/spec/controllers/application_controller_spec.rb +24 -0
  22. data/spec/dummy/Rakefile +6 -0
  23. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  24. data/spec/dummy/app/controllers/examples_controller.rb +11 -0
  25. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  26. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  27. data/spec/dummy/bin/bundle +3 -0
  28. data/spec/dummy/bin/rails +4 -0
  29. data/spec/dummy/bin/rake +4 -0
  30. data/spec/dummy/config.ru +4 -0
  31. data/spec/dummy/config/application.rb +18 -0
  32. data/spec/dummy/config/boot.rb +5 -0
  33. data/spec/dummy/config/database.yml +5 -0
  34. data/spec/dummy/config/environment.rb +5 -0
  35. data/spec/dummy/config/environments/development.rb +29 -0
  36. data/spec/dummy/config/environments/production.rb +80 -0
  37. data/spec/dummy/config/environments/test.rb +36 -0
  38. data/spec/dummy/config/initializers/standard_rails_initializers.rb +9 -0
  39. data/spec/dummy/config/locales/en.yml +5 -0
  40. data/spec/dummy/config/routes.rb +3 -0
  41. data/spec/dummy/db/test.sqlite3 +0 -0
  42. data/spec/neat_pages/base_spec.rb +31 -5
  43. data/spec/neat_pages/helpers/builder_spec.rb +109 -0
  44. data/spec/neat_pages/helpers/navigation_spec.rb +105 -0
  45. data/spec/neat_pages/helpers/status_spec.rb +65 -0
  46. data/spec/neat_pages/helpers_spec.rb +67 -0
  47. data/spec/neat_pages/implants/mongoid_implant_spec.rb +43 -0
  48. data/spec/spec_helper.rb +21 -6
  49. data/spec/support/views_helper.rb +16 -0
  50. data/vendor/assets/javascripts/jquery.hashchange.min.js +1 -1
  51. metadata +134 -42
  52. data/lib/neat_pages/implants.rb +0 -12
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe NeatPages::Helpers::Builder do
4
+ include ViewHelpers
5
+
6
+ describe "#b" do
7
+ context "with an empty builder" do
8
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request_mock) }
9
+
10
+ context "when inserting the string <span>1</span>" do
11
+ subject { builder.b '<span>1</span>' }
12
+
13
+ it { should eql '<span>1</span>' }
14
+ it { should be_html_safe }
15
+
16
+ context "and inserting another <span>2</span>" do
17
+ before { builder.b '<span>1</span>' }
18
+
19
+ subject { builder.b '<span>2</span>' }
20
+
21
+ it { should eql '<span>1</span><span>2</span>' }
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ describe "#li" do
28
+ context "with an empty builder" do
29
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request_mock) }
30
+
31
+ context "when inserting a li with the value 1" do
32
+ before { builder.li '1' }
33
+
34
+ specify { builder.b.should eql '<li>1</li>' }
35
+ end
36
+
37
+ context "when inserting an hidden li with the value 1, the css_class 'active'" do
38
+ before { builder.li '1', 'active', hidden: true }
39
+
40
+ specify { builder.b.should eql '<li class="active" style="display:none">1</li>' }
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ describe "#path_to" do
47
+ context "with a builder having a base_url http://www.test.dev" do
48
+
49
+ context "and no params" do
50
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request_mock(host: 'www.test.dev')) }
51
+
52
+ context "when asking for the path_to page 6" do
53
+ specify { builder.path_to(6).should eql 'http://www.test.dev?page=6' }
54
+ end
55
+ end
56
+
57
+ context "and the params sort=1, filter=type" do
58
+ let(:request) { request_mock(host: 'www.test.dev', env: { 'action_dispatch.request.query_parameters' => { 'sort' => 1, 'filter' => 'type' } })}
59
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request) }
60
+
61
+ context "when asking for the path_to page 6" do
62
+ specify { builder.path_to(6).should eql 'http://www.test.dev?sort=1&filter=type&page=6' }
63
+ end
64
+ end
65
+
66
+ context "and the params sort=1, filter=type, page=5" do
67
+ let(:request) { request_mock(host: 'www.test.dev', env: { 'action_dispatch.request.query_parameters' => { 'sort' => 1, 'filter' => 'type', 'page' => 5 } })}
68
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request) }
69
+
70
+ context "when asking for the path_to page 6" do
71
+ specify { builder.path_to(6).should eql 'http://www.test.dev?sort=1&filter=type&page=6' }
72
+ end
73
+ end
74
+
75
+ context "and the params page=5" do
76
+ let(:request) { request_mock(host: 'www.test.dev', env: { 'action_dispatch.request.query_parameters' => { 'page' => 5 } })}
77
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request) }
78
+
79
+ context "when asking for the path_to page 6" do
80
+ specify { builder.path_to(6).should eql 'http://www.test.dev?page=6' }
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "#reset_builder" do
87
+ context "with an empty builder" do
88
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request_mock) }
89
+
90
+ context "when resetting the builder" do
91
+ before { builder.reset_builder }
92
+
93
+ specify { builder.b.should eql '' }
94
+ end
95
+ end
96
+
97
+ context "with a builder having the value '<span>1</span>'" do
98
+ let(:builder) { NeatPages::Helpers::Builder.new(double, request_mock) }
99
+
100
+ before { builder.b '<span>1</span>' }
101
+
102
+ context "when resetting the builder" do
103
+ before { builder.reset_builder }
104
+
105
+ specify { builder.b.should eql '' }
106
+ end
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,105 @@
1
+ require 'spec_helper'
2
+
3
+ describe NeatPages::Helpers::Navigation do
4
+ include ViewHelpers
5
+
6
+ describe "#generate" do
7
+
8
+ let(:pagination) { double() }
9
+
10
+ context "with a pagination that doesn't need pages" do
11
+ before { pagination.stub(:paginated?).and_return(false) }
12
+
13
+ let(:builder) { NeatPages::Helpers::Navigation.new(pagination, request_mock) }
14
+
15
+ context "when generating the navigation" do
16
+ specify { builder.generate.should be_empty }
17
+ end
18
+ end
19
+ context "with a 40 items pagination starting at 20 and having 10 items per page" do
20
+ before do
21
+ pagination.stub(:paginated?).and_return(true)
22
+ pagination.stub(:current_page).and_return(3)
23
+ pagination.stub(:next?).and_return(true)
24
+ pagination.stub(:next_page).and_return(4)
25
+ pagination.stub(:offset).and_return(20)
26
+ pagination.stub(:per_page).and_return(10)
27
+ pagination.stub(:previous?).and_return(true)
28
+ pagination.stub(:previous_page).and_return(2)
29
+ pagination.stub(:total_items).and_return(40)
30
+ pagination.stub(:total_pages).and_return(4)
31
+ end
32
+
33
+ let(:builder) { NeatPages::Helpers::Navigation.new(pagination, request_mock) }
34
+
35
+ context "when generating the navigation" do
36
+ specify { builder.generate.should eql '<ul class="standard" id="neat-pages-navigation" data-neat-pages-control=="navigation" data-per-page="10" data-total-items="40" data-total-pages="4"><li class="move previous "><a data-page="2" href="http://test.dev?page=2" class="previous">&laquo; Previous</a></li><li class="page"><a data-page="1" href="http://test.dev?page=1">1</a></li><li class="page"><a data-page="2" href="http://test.dev?page=2">2</a></li><li class="page selected"><a data-page="3" href="http://test.dev?page=3">3</a></li><li class="page"><a data-page="4" href="http://test.dev?page=4">4</a></li><li class="move next "><a data-page="4" href="http://test.dev?page=4" class="next">Next &raquo;</a></li></ul>' }
37
+ end
38
+ end
39
+
40
+ context "with a 40 items pagination starting at 30 and having 10 items per page" do
41
+ before do
42
+ pagination.stub(:paginated?).and_return(true)
43
+ pagination.stub(:current_page).and_return(3)
44
+ pagination.stub(:next?).and_return(false)
45
+ pagination.stub(:next_page).and_return(nil)
46
+ pagination.stub(:offset).and_return(30)
47
+ pagination.stub(:per_page).and_return(10)
48
+ pagination.stub(:previous?).and_return(true)
49
+ pagination.stub(:previous_page).and_return(2)
50
+ pagination.stub(:total_items).and_return(40)
51
+ pagination.stub(:total_pages).and_return(4)
52
+ end
53
+
54
+ let(:builder) { NeatPages::Helpers::Navigation.new(pagination, request_mock) }
55
+
56
+ context "when generating the navigation" do
57
+ specify { builder.generate.should eql '<ul class="standard" id="neat-pages-navigation" data-neat-pages-control=="navigation" data-per-page="10" data-total-items="40" data-total-pages="4"><li class="move previous "><a data-page="2" href="http://test.dev?page=2" class="previous">&laquo; Previous</a></li><li class="page"><a data-page="1" href="http://test.dev?page=1">1</a></li><li class="page"><a data-page="2" href="http://test.dev?page=2">2</a></li><li class="page selected"><a data-page="3" href="http://test.dev?page=3">3</a></li><li class="page"><a data-page="4" href="http://test.dev?page=4">4</a></li><li class="move next disabled"><a data-page="#" href="#" class="next">Next &raquo;</a></li></ul>' }
58
+ end
59
+ end
60
+
61
+ context "with a 200 items pagination starting at 110 and having 10 items per page" do
62
+ before do
63
+ pagination.stub(:paginated?).and_return(true)
64
+ pagination.stub(:current_page).and_return(12)
65
+ pagination.stub(:next?).and_return(true)
66
+ pagination.stub(:next_page).and_return(13)
67
+ pagination.stub(:offset).and_return(110)
68
+ pagination.stub(:per_page).and_return(10)
69
+ pagination.stub(:previous?).and_return(true)
70
+ pagination.stub(:previous_page).and_return(11)
71
+ pagination.stub(:total_items).and_return(200)
72
+ pagination.stub(:total_pages).and_return(20)
73
+ end
74
+
75
+ let(:builder) { NeatPages::Helpers::Navigation.new(pagination, request_mock) }
76
+
77
+ context "when generating the navigation" do
78
+ specify { builder.generate.should eql '<ul class="standard" id="neat-pages-navigation" data-neat-pages-control=="navigation" data-per-page="10" data-total-items="200" data-total-pages="20">'+
79
+ '<li class="move previous "><a data-page="11" href="http://test.dev?page=11" class="previous">&laquo; Previous</a></li>'+
80
+ '<li class="page" style="display:none"><a data-page="1" href="http://test.dev?page=1">1</a></li>'+
81
+ '<li class="page" style="display:none"><a data-page="2" href="http://test.dev?page=2">2</a></li>'+
82
+ '<li class="page" style="display:none"><a data-page="3" href="http://test.dev?page=3">3</a></li>'+
83
+ '<li class="page" style="display:none"><a data-page="4" href="http://test.dev?page=4">4</a></li>'+
84
+ '<li class="page" style="display:none"><a data-page="5" href="http://test.dev?page=5">5</a></li>'+
85
+ '<li class="page" style="display:none"><a data-page="6" href="http://test.dev?page=6">6</a></li>'+
86
+ '<li class="page" style="display:none"><a data-page="7" href="http://test.dev?page=7">7</a></li>'+
87
+ '<li class="page"><a data-page="8" href="http://test.dev?page=8">8</a></li>'+
88
+ '<li class="page"><a data-page="9" href="http://test.dev?page=9">9</a></li>'+
89
+ '<li class="page"><a data-page="10" href="http://test.dev?page=10">10</a></li>'+
90
+ '<li class="page"><a data-page="11" href="http://test.dev?page=11">11</a></li>'+
91
+ '<li class="page selected"><a data-page="12" href="http://test.dev?page=12">12</a></li>'+
92
+ '<li class="page"><a data-page="13" href="http://test.dev?page=13">13</a></li>'+
93
+ '<li class="page"><a data-page="14" href="http://test.dev?page=14">14</a></li>'+
94
+ '<li class="page"><a data-page="15" href="http://test.dev?page=15">15</a></li>'+
95
+ '<li class="page"><a data-page="16" href="http://test.dev?page=16">16</a></li>'+
96
+ '<li class="page"><a data-page="17" href="http://test.dev?page=17">17</a></li>'+
97
+ '<li class="page" style="display:none"><a data-page="18" href="http://test.dev?page=18">18</a></li>'+
98
+ '<li class="page" style="display:none"><a data-page="19" href="http://test.dev?page=19">19</a></li>'+
99
+ '<li class="page" style="display:none"><a data-page="20" href="http://test.dev?page=20">20</a></li>'+
100
+ '<li class="move next "><a data-page="13" href="http://test.dev?page=13" class="next">Next &raquo;</a></li></ul>' }
101
+ end
102
+ end
103
+
104
+ end
105
+ end
@@ -0,0 +1,65 @@
1
+ require 'spec_helper'
2
+
3
+ describe NeatPages::Helpers::Status do
4
+ include ViewHelpers
5
+
6
+ describe "#generate" do
7
+
8
+ let(:pagination) { double() }
9
+
10
+ context "with an empty pagination" do
11
+ before { pagination.stub(:empty?).and_return(true) }
12
+
13
+ let(:builder) { NeatPages::Helpers::Status.new(pagination, request_mock) }
14
+
15
+ context "when generating the status" do
16
+ specify { builder.generate.should be_empty }
17
+ end
18
+ end
19
+
20
+ context "with a pagination out of bound" do
21
+ before do
22
+ pagination.stub(:empty?).and_return(false)
23
+ pagination.stub(:out_of_bound?).and_return(true)
24
+ end
25
+
26
+ let(:builder) { NeatPages::Helpers::Status.new(pagination, request_mock) }
27
+
28
+ context "when generating the status" do
29
+ specify { builder.generate.should be_empty }
30
+ end
31
+ end
32
+
33
+ context "with a 100 items pagination starting at 20 and having 10 items per page" do
34
+ before do
35
+ pagination.stub(:empty?).and_return(false)
36
+ pagination.stub(:out_of_bound?).and_return(false)
37
+ pagination.stub(:offset).and_return(20)
38
+ pagination.stub(:per_page).and_return(10)
39
+ pagination.stub(:total_items).and_return(100)
40
+ end
41
+
42
+ let(:builder) { NeatPages::Helpers::Status.new(pagination, request_mock) }
43
+
44
+ context "when generating the status" do
45
+ specify { builder.generate.should eql '<span data-neat-pages-control="status" id="neat-pages-status"><span class="from">21</span> to <span class="to">30</span>/<span class="total">100</span></span>' }
46
+ end
47
+ end
48
+
49
+ context "with a 23 items pagination starting at 20 and having 10 items per page" do
50
+ before do
51
+ pagination.stub(:empty?).and_return(false)
52
+ pagination.stub(:out_of_bound?).and_return(false)
53
+ pagination.stub(:offset).and_return(20)
54
+ pagination.stub(:per_page).and_return(10)
55
+ pagination.stub(:total_items).and_return(23)
56
+ end
57
+
58
+ let(:builder) { NeatPages::Helpers::Status.new(pagination, request_mock) }
59
+
60
+ context "when generating the status" do
61
+ specify { builder.generate.should eql '<span data-neat-pages-control="status" id="neat-pages-status"><span class="from">21</span> to <span class="to">23</span>/<span class="total">23</span></span>' }
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+
3
+ describe NeatPages::Helpers do
4
+ include ViewHelpers
5
+
6
+ let(:pagination) { double() }
7
+ let(:views) { Module.new { extend NeatPages::Helpers } }
8
+
9
+ describe "#neat_pages_ajax_items" do
10
+ before { views.stub(:render).and_return '[html_list_of_items]' }
11
+
12
+ context "when rendering the ajax items" do
13
+ specify { views.neat_pages_ajax_items('items').should eql '<div id="neat-pages-ajax-wrapper" class="first-load">[html_list_of_items]</div>' }
14
+ end
15
+
16
+ context "when rendering the ajax items for a table" do
17
+ specify { views.neat_pages_ajax_items('items', wrapper: 'tbody').should eql '<tbody id="neat-pages-ajax-wrapper" class="first-load">[html_list_of_items]</tbody>' }
18
+ end
19
+ end
20
+
21
+ describe "#neat_pages_navigation" do
22
+ before do
23
+ views.stub(:request).and_return(request_mock(host: 'testview.dev'))
24
+
25
+ pagination.stub(:paginated?).and_return(true)
26
+ pagination.stub(:current_page).and_return(3)
27
+ pagination.stub(:next?).and_return(true)
28
+ pagination.stub(:next_page).and_return(4)
29
+ pagination.stub(:offset).and_return(20)
30
+ pagination.stub(:per_page).and_return(10)
31
+ pagination.stub(:previous?).and_return(true)
32
+ pagination.stub(:previous_page).and_return(2)
33
+ pagination.stub(:total_items).and_return(40)
34
+ pagination.stub(:total_pages).and_return(4)
35
+
36
+ views.stub(:pagination).and_return(pagination)
37
+ end
38
+
39
+ context "when rendering the navigation" do
40
+ specify { views.neat_pages_navigation.should eql '<ul class="standard" id="neat-pages-navigation" data-neat-pages-control=="navigation" data-per-page="10" data-total-items="40" data-total-pages="4">' +
41
+ '<li class="move previous "><a data-page="2" href="http://testview.dev?page=2" class="previous">&laquo; Previous</a></li>' +
42
+ '<li class="page"><a data-page="1" href="http://testview.dev?page=1">1</a></li>' +
43
+ '<li class="page"><a data-page="2" href="http://testview.dev?page=2">2</a></li>' +
44
+ '<li class="page selected"><a data-page="3" href="http://testview.dev?page=3">3</a></li>' +
45
+ '<li class="page"><a data-page="4" href="http://testview.dev?page=4">4</a></li>' +
46
+ '<li class="move next "><a data-page="4" href="http://testview.dev?page=4" class="next">Next &raquo;</a></li></ul>' }
47
+ end
48
+ end
49
+
50
+ describe "#neat_pages_status" do
51
+ before do
52
+ views.stub(:request).and_return(request_mock)
53
+
54
+ pagination.stub(:empty?).and_return(false)
55
+ pagination.stub(:out_of_bound?).and_return(false)
56
+ pagination.stub(:offset).and_return(20)
57
+ pagination.stub(:per_page).and_return(10)
58
+ pagination.stub(:total_items).and_return(100)
59
+
60
+ views.stub(:pagination).and_return(pagination)
61
+ end
62
+
63
+ context "when rendering the status" do
64
+ specify { views.neat_pages_status.should eql '<span data-neat-pages-control="status" id="neat-pages-status"><span class="from">21</span> to <span class="to">30</span>/<span class="total">100</span></span>' }
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe NeatPages::Implants::MongoidCriteriaImplant do
4
+ let(:pagination) { double() }
5
+ let(:implant) { Module.new { extend NeatPages::Implants::MongoidCriteriaImplant } }
6
+
7
+ describe "#paginate" do
8
+ context "when the pagination isn't initialized" do
9
+ it "raises" do
10
+ expect { implant.paginate(nil) }.to raise_error NeatPages::Uninitalized
11
+ end
12
+ end
13
+
14
+ context "when the page is out of bound" do
15
+ before do
16
+ implant.stub(:count)
17
+ pagination.stub(:set_total_items)
18
+ pagination.stub(:out_of_bound?).and_return true
19
+ end
20
+
21
+ it "raises" do
22
+ expect { implant.paginate(pagination) }.to raise_error NeatPages::OutOfBound
23
+ end
24
+ end
25
+
26
+ context "when asking for a page in bound" do
27
+ before do
28
+ implant.stub(:count)
29
+ implant.stub(:limit).and_return('')
30
+ implant.stub(:offset).and_return(implant)
31
+
32
+ pagination.stub(:set_total_items)
33
+ pagination.stub(:out_of_bound?).and_return false
34
+ pagination.stub(:offset)
35
+ pagination.stub(:limit)
36
+ end
37
+
38
+ specify { implant.paginate(pagination).should eql '' }
39
+ end
40
+
41
+ end
42
+ end
43
+
@@ -1,12 +1,27 @@
1
- require "rubygems"
2
- require "bundler/setup"
1
+ ENV["RAILS_ENV"] ||= 'test'
3
2
 
4
- require 'rspec'
5
- require 'rails'
3
+ require 'simplecov'
4
+ require 'simplecov-rcov-text'
5
+ require 'coveralls'
6
6
 
7
- require File.expand_path('../../lib/neat-pages', __FILE__)
7
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
8
+ SimpleCov::Formatter::HTMLFormatter,
9
+ SimpleCov::Formatter::RcovTextFormatter,
10
+ Coveralls::SimpleCov::Formatter
11
+ ]
8
12
 
9
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
13
+ SimpleCov.start do
14
+ add_filter "spec/dummy"
15
+ add_filter "spec/support"
16
+ add_filter "spec/neat-pages_spec.rb"
17
+ end
18
+
19
+ require File.expand_path("../dummy/config/environment", __FILE__)
20
+
21
+ require 'rspec/rails'
22
+ require 'rspec/autorun'
23
+
24
+ Dir["./spec/support/**/*.rb"].sort.each {|f| require f }
10
25
 
11
26
  RSpec.configure do |config|
12
27
  config.mock_with :rspec
@@ -0,0 +1,16 @@
1
+ module ViewHelpers
2
+ def request_mock(options={})
3
+ options.reverse_merge! env: {}, host: 'test.dev', path_info: '', port: 80, protocol: 'http://'
4
+
5
+ env = { 'action_dispatch.request.query_parameters' => {} }.merge options[:env]
6
+
7
+ request = double()
8
+ request.stub(:protocol).and_return options[:protocol]
9
+ request.stub(:host).and_return options[:host]
10
+ request.stub(:port).and_return options[:port]
11
+ request.stub(:path_info).and_return options[:path_info]
12
+ request.stub(:env).and_return env
13
+
14
+ return request
15
+ end
16
+ end
@@ -6,4 +6,4 @@
6
6
  * Dual licensed under the MIT and GPL licenses.
7
7
  * http://benalman.com/about/license/
8
8
  */
9
- (function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
9
+ (function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}!$.support.boxModel&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);