workarea-jquery_magnify 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +20 -0
  3. data/.github/ISSUE_TEMPLATE/bug_report.md +37 -0
  4. data/.github/ISSUE_TEMPLATE/documentation-request.md +17 -0
  5. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. data/.github/workflows/ci.yml +54 -0
  7. data/.gitignore +21 -0
  8. data/.rubocop.yml +2 -0
  9. data/CHANGELOG.md +1 -0
  10. data/CODE_OF_CONDUCT.md +3 -0
  11. data/CONTRIBUTING.md +3 -0
  12. data/Gemfile +7 -0
  13. data/LICENSE.md +3 -0
  14. data/README.md +99 -0
  15. data/Rakefile +109 -0
  16. data/app/assets/javascripts/jquery_magnify/jquery.magnify.js +236 -0
  17. data/bin/rails +20 -0
  18. data/config/initializers/appends.rb +6 -0
  19. data/config/initializers/workarea.rb +3 -0
  20. data/config/routes.rb +2 -0
  21. data/lib/tasks/jquery_magnify_tasks.rake +4 -0
  22. data/lib/workarea/jquery_magnify.rb +11 -0
  23. data/lib/workarea/jquery_magnify/engine.rb +8 -0
  24. data/lib/workarea/jquery_magnify/version.rb +5 -0
  25. data/test/dummy/Rakefile +6 -0
  26. data/test/dummy/app/assets/config/manifest.js +4 -0
  27. data/test/dummy/app/assets/images/.keep +0 -0
  28. data/test/dummy/app/assets/javascripts/application.js +13 -0
  29. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  30. data/test/dummy/app/controllers/application_controller.rb +3 -0
  31. data/test/dummy/app/controllers/concerns/.keep +0 -0
  32. data/test/dummy/app/helpers/application_helper.rb +2 -0
  33. data/test/dummy/app/jobs/application_job.rb +2 -0
  34. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  35. data/test/dummy/app/models/concerns/.keep +0 -0
  36. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  37. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  38. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  39. data/test/dummy/bin/bundle +3 -0
  40. data/test/dummy/bin/rails +4 -0
  41. data/test/dummy/bin/rake +4 -0
  42. data/test/dummy/bin/setup +38 -0
  43. data/test/dummy/bin/update +29 -0
  44. data/test/dummy/bin/yarn +11 -0
  45. data/test/dummy/config.ru +5 -0
  46. data/test/dummy/config/application.rb +28 -0
  47. data/test/dummy/config/boot.rb +5 -0
  48. data/test/dummy/config/cable.yml +10 -0
  49. data/test/dummy/config/environment.rb +5 -0
  50. data/test/dummy/config/environments/development.rb +54 -0
  51. data/test/dummy/config/environments/production.rb +91 -0
  52. data/test/dummy/config/environments/test.rb +44 -0
  53. data/test/dummy/config/initializers/application_controller_renderer.rb +8 -0
  54. data/test/dummy/config/initializers/assets.rb +14 -0
  55. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  56. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  57. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  58. data/test/dummy/config/initializers/inflections.rb +16 -0
  59. data/test/dummy/config/initializers/mime_types.rb +4 -0
  60. data/test/dummy/config/initializers/workarea.rb +5 -0
  61. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  62. data/test/dummy/config/locales/en.yml +33 -0
  63. data/test/dummy/config/puma.rb +56 -0
  64. data/test/dummy/config/routes.rb +5 -0
  65. data/test/dummy/config/secrets.yml +32 -0
  66. data/test/dummy/config/spring.rb +6 -0
  67. data/test/dummy/db/seeds.rb +2 -0
  68. data/test/dummy/lib/assets/.keep +0 -0
  69. data/test/dummy/log/.keep +0 -0
  70. data/test/dummy/package.json +5 -0
  71. data/test/teaspoon_env.rb +6 -0
  72. data/test/test_helper.rb +10 -0
  73. data/workarea-jquery_magnify.gemspec +20 -0
  74. metadata +130 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 85422a157552b0b4970f5ab7e13b9baa321f28fe428385e930d5901e203b6d58
4
+ data.tar.gz: 57afd6220dd041ea02d7eb15ecedfa6fbaf86745555c61a9d2057224ead50c03
5
+ SHA512:
6
+ metadata.gz: 1d3f93171998bbbd23eb7082232c9ab717faa6aa0121180bcb8b73f39d6882867d30434e11a96ac11d4565e7747336d95d03705f2d4a2e5c6ab396db22143a01
7
+ data.tar.gz: 49278183b6c7387533e6d5a4c001b8e5e9367dca6a12fb3a6c780dea7668ff0178008fb2779da62a45efb8b06b7d810d2d64850e08d3491ca3cf9e4e5ef91a26
@@ -0,0 +1,20 @@
1
+ # editorconfig.org
2
+ root = true
3
+
4
+ [*]
5
+ charset = utf-8
6
+ indent_style = space
7
+ end_of_line = lf
8
+ trim_trailing_whitespace = true
9
+ insert_final_newline = true
10
+
11
+ [{*.rb,*.haml,*.decorator,*.yml,*.yaml,*.jbuilder}]
12
+ indent_size = 2
13
+ indent_style = space
14
+
15
+ [{*.js,*.jst,*.ejs,*.scss}]
16
+ indent_size = 4
17
+
18
+ [*.md]
19
+ indent_size = 4
20
+ trim_trailing_whitespace = false
@@ -0,0 +1,37 @@
1
+ ---
2
+ name: Bug report
3
+ about: Create a report to help us improve Workarea
4
+ title: ''
5
+ labels: bug
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ ⚠️**Before you create**⚠️
11
+ Please verify the issue you're experiencing is not part of your Workarea project customizations. The best way to do this is with a [vanilla Workarea installation](https://developer.workarea.com/articles/create-a-new-host-application.html). This will help us spend time on fixes/improvements for the whole community. Thank you!
12
+
13
+ **Describe the bug**
14
+ A clear and concise description of what the bug is.
15
+
16
+ **To Reproduce**
17
+ Steps to reproduce the behavior:
18
+ 1. Go to '...'
19
+ 2. Click on '....'
20
+ 3. Scroll down to '....'
21
+ 4. See error
22
+
23
+ **Expected behavior**
24
+ A clear and concise description of what you expected to happen.
25
+
26
+ **Workarea Setup (please complete the following information):**
27
+ - Workarea Version: [e.g. v3.4.6]
28
+ - Plugins [e.g. workarea-blog, workarea-sitemaps]
29
+
30
+ **Attachments**
31
+ If applicable, add any attachments to help explain your problem, things like:
32
+ - screenshots
33
+ - Gemfile.lock
34
+ - test cases
35
+
36
+ **Additional context**
37
+ Add any other context about the problem here.
@@ -0,0 +1,17 @@
1
+ ---
2
+ name: Documentation request
3
+ about: Suggest documentation
4
+ title: ''
5
+ labels: documentation
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your documentation related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm confused by [...]
12
+
13
+ **Describe the article you'd like**
14
+ A clear and concise description of what would be in the documentation article.
15
+
16
+ **Additional context**
17
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,20 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for Workarea
4
+ title: ''
5
+ labels: enhancement
6
+ assignees: ''
7
+
8
+ ---
9
+
10
+ **Is your feature request related to a problem? Please describe.**
11
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12
+
13
+ **Describe the solution you'd like**
14
+ A clear and concise description of what you want to happen.
15
+
16
+ **Describe alternatives you've considered**
17
+ A clear and concise description of any alternative solutions or features you've considered.
18
+
19
+ **Additional context**
20
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,54 @@
1
+ name: CI
2
+ on: [push]
3
+
4
+ jobs:
5
+ static_analysis:
6
+ runs-on: ubuntu-latest
7
+ steps:
8
+ - uses: actions/checkout@v1
9
+ - uses: workarea-commerce/ci/bundler-audit@v1
10
+ - uses: workarea-commerce/ci/rubocop@v1
11
+
12
+ admin_tests:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - uses: actions/checkout@v1
16
+ - uses: actions/setup-ruby@v1
17
+ with:
18
+ ruby-version: 2.6.x
19
+ - uses: workarea-commerce/ci/test@v1
20
+ with:
21
+ command: bin/rails app:workarea:test:admin
22
+
23
+ core_tests:
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - uses: actions/checkout@v1
27
+ - uses: actions/setup-ruby@v1
28
+ with:
29
+ ruby-version: 2.6.x
30
+ - uses: workarea-commerce/ci/test@v1
31
+ with:
32
+ command: bin/rails app:workarea:test:core
33
+
34
+ storefront_tests:
35
+ runs-on: ubuntu-latest
36
+ steps:
37
+ - uses: actions/checkout@v1
38
+ - uses: actions/setup-ruby@v1
39
+ with:
40
+ ruby-version: 2.6.x
41
+ - uses: workarea-commerce/ci/test@v1
42
+ with:
43
+ command: bin/rails app:workarea:test:storefront
44
+
45
+ plugins_tests:
46
+ runs-on: ubuntu-latest
47
+ steps:
48
+ - uses: actions/checkout@v1
49
+ - uses: actions/setup-ruby@v1
50
+ with:
51
+ ruby-version: 2.6.x
52
+ - uses: workarea-commerce/ci/test@v1
53
+ with:
54
+ command: bin/rails app:workarea:test:plugins
@@ -0,0 +1,21 @@
1
+ .bundle/
2
+ log/*.log
3
+ pkg/
4
+ test/dummy/db/*.sqlite3
5
+ test/dummy/db/*.sqlite3-journal
6
+ test/dummy/log/*.log
7
+ test/dummy/tmp/
8
+ .DS_Store
9
+ .byebug_history
10
+ .bundle/
11
+ .sass-cache/
12
+ Gemfile.lock
13
+ pkg/
14
+ test/dummy/tmp/
15
+ test/dummy/public/
16
+ log/*.log
17
+ test/dummy/log/*.log
18
+ test/dummy/db/*.sqlite3
19
+ test/dummy/db/*.sqlite3-journal
20
+ node_modules/
21
+ .rubocop-https-*
@@ -0,0 +1,2 @@
1
+ inherit_from:
2
+ - https://raw.githubusercontent.com/workarea-commerce/workarea/master/.rubocop.yml
@@ -0,0 +1 @@
1
+
@@ -0,0 +1,3 @@
1
+ View this plugin's code of conduct here:
2
+
3
+ <https://github.com/workarea-commerce/workarea/blob/master/CODE_OF_CONDUCT.md>
@@ -0,0 +1,3 @@
1
+ View this plugin's contribution guidelines here:
2
+
3
+ <https://github.com/workarea-commerce/workarea/blob/master/CONTRIBUTING.md>
data/Gemfile ADDED
@@ -0,0 +1,7 @@
1
+ source 'https://rubygems.org'
2
+ git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
+
4
+ gemspec
5
+
6
+ gem 'workarea', github: 'workarea-commerce/workarea'
7
+ gem 'rubocop'
@@ -0,0 +1,3 @@
1
+ View this plugin's license here:
2
+
3
+ <https://github.com/workarea-commerce/workarea/blob/master/LICENSE.md>
@@ -0,0 +1,99 @@
1
+ Workarea Jquery Magnify
2
+ ================================================================================
3
+
4
+ Note: This work is in progress and part of the workarea-zoom plugin.
5
+
6
+ About
7
+ --------------------------------------------------------------------------------
8
+ Jquery Magnify let your user enlarge images on mouseover, it's a great candidate for non-touch enabled devices with a small support for touch-enabled devices.
9
+
10
+ If you are looking for a better experience on touch-enabled devices, you should check out: https://stash.tools.weblinc.com/projects/WP/repos/workarea-jquery-zoom/browse.
11
+
12
+
13
+ Getting Started
14
+ --------------------------------------------------------------------------------
15
+
16
+ Add the gem to your application's Gemfile:
17
+
18
+ # ...
19
+ gem 'workarea-jquery_magnify'
20
+ # ...
21
+
22
+ This Gem will mount the jquery.magnify asset in your application.
23
+
24
+ Example
25
+ --------------------------------------------------------------------------------
26
+
27
+ ```html
28
+ <div class="magnify">
29
+ <div data-magnify-src="http://example.com/big-image.jpg" class="magnify__container">
30
+ <img src="http://example.com/small-image.jpg" class="magnify__image">
31
+ </div>
32
+ </div>
33
+ ```
34
+
35
+ ```css
36
+ .magnify {
37
+ width: 320px;
38
+ }
39
+
40
+ .magnify__container {
41
+ position: relative;
42
+ }
43
+
44
+ .magnify__image{
45
+ display: block;
46
+ width: 100%;
47
+ min-width: 100%;
48
+ }
49
+ ```
50
+
51
+ ```javascript
52
+ $(document).ready(function() {
53
+ $('.magnify__container').magnify();
54
+ });
55
+ ```
56
+
57
+
58
+ Options
59
+ --------------------------------------------------------------------------------
60
+
61
+ You have the ability to pass your options like this:
62
+
63
+ ```javascript
64
+ $('.magnify').magnify({
65
+ url: null,
66
+ touchSupport: false
67
+ });
68
+ ```
69
+
70
+ Different options are available:
71
+
72
+ Name | Default | Description
73
+ ------------- | ------------- | -------------
74
+ touchSupport | ```false``` | Enable/Disable finger gestures on touch-enabled devices
75
+ url | ```null``` | The url of the big magnify image, if not defined, jquery.magnify will fetch the attribute ```data-magnify-src```given.
76
+
77
+ Events
78
+ --------------------------------------------------------------------------------
79
+
80
+ You can destroy the widget for the instance given, it's helpful when you want to go back to a clean state.
81
+
82
+ ```javascript
83
+ // Create instance
84
+ $('.magnify__container').magnify();
85
+
86
+ // Remove instance
87
+ $('.magnify__container').trigger('magnify.destroy');
88
+ ```
89
+
90
+ Workarea Commerce Documentation
91
+ --------------------------------------------------------------------------------
92
+
93
+ See [https://developer.workarea.com](https://developer.workarea.com) for Workarea Commerce documentation.
94
+
95
+ License
96
+ --------------------------------------------------------------------------------
97
+
98
+ Workarea Styled Selects is released under the [Business Software License](LICENSE)
99
+
@@ -0,0 +1,109 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+ RDoc::Task.new(:rdoc) do |rdoc|
9
+ rdoc.rdoc_dir = 'rdoc'
10
+ rdoc.title = 'Jquery Magnify'
11
+ rdoc.options << '--line-numbers'
12
+ rdoc.rdoc_files.include('README.md')
13
+ rdoc.rdoc_files.include('lib/**/*.rb')
14
+ end
15
+
16
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
17
+ load 'rails/tasks/engine.rake'
18
+ load 'rails/tasks/statistics.rake'
19
+
20
+ require 'rake/testtask'
21
+ Rake::TestTask.new(:test) do |t|
22
+ t.libs << 'lib'
23
+ t.libs << 'test'
24
+ t.pattern = 'test/**/*_test.rb'
25
+ t.verbose = false
26
+ end
27
+ task default: :test
28
+
29
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
30
+ require 'workarea/jquery_magnify/version'
31
+
32
+ desc 'Generate the changelog based on git history'
33
+ task :changelog, :from, :to do |t, args|
34
+ require 'date'
35
+
36
+ from = args[:from] || `git describe --tags --abbrev=0`.strip
37
+ to = args[:to] || 'HEAD'
38
+ log = `git log #{from}..#{to} --pretty=format:'%an|%B___'`
39
+
40
+ puts "Workarea Jquery Magnify #{Workarea::JqueryMagnify::VERSION} (#{Time.zone.today})"
41
+ puts '-' * 80
42
+ puts
43
+
44
+ log.split(/___/).each do |commit|
45
+ pieces = commit.split('|').reverse
46
+ author = pieces.pop.strip
47
+ message = pieces.join.strip
48
+
49
+ next if message =~ /^\s*Merge pull request/
50
+ next if message =~ /No changelog/i
51
+
52
+ project_key = nil # TODO Replace with your Project's Jira key
53
+
54
+ if project_key.blank?
55
+ puts "To clean up your release notes, add your project's Jira key to the Changelog Rake task!"
56
+ else
57
+ ticket = message.scan(/#{project_key}-\d+/)[0]
58
+ next if ticket.nil?
59
+ next if message =~ /^\s*Merge branch/ && ticket.nil?
60
+ end
61
+
62
+ first_line = false
63
+
64
+ message.each_line do |line|
65
+ if !first_line
66
+ first_line = true
67
+ puts "* #{line}"
68
+ elsif line.strip.empty?
69
+ puts
70
+ else
71
+ puts " #{line}"
72
+ end
73
+ end
74
+
75
+ puts " #{author}"
76
+ puts
77
+ end
78
+ end
79
+
80
+ desc "Release version #{Workarea::JqueryMagnify::VERSION} of the gem"
81
+ task :release do
82
+ host = "https://#{ENV['BUNDLE_GEMS__WEBLINC__COM']}@gems.weblinc.com"
83
+
84
+ system 'touch CHANGELOG.md'
85
+ system 'echo "$(rake changelog)
86
+
87
+
88
+ $(cat CHANGELOG.md)" > CHANGELOG.md'
89
+ system 'git add CHANGELOG.md && git commit -m "Update changelog" && git push origin HEAD'
90
+
91
+ system "git tag -a v#{Workarea::JqueryMagnify::VERSION} -m 'Tagging #{Workarea::JqueryMagnify::VERSION}'"
92
+ system 'git push --tags'
93
+
94
+ system "gem build workarea-jquery_magnify.gemspec"
95
+ system "gem push workarea-jquery_magnify-#{Workarea::JqueryMagnify::VERSION}.gem"
96
+ system "gem push workarea-jquery_magnify-#{Workarea::JqueryMagnify::VERSION}.gem --host #{host}"
97
+ system "rm workarea-jquery_magnify-#{Workarea::JqueryMagnify::VERSION}.gem"
98
+ end
99
+
100
+ desc 'Run the JavaScript tests'
101
+ ENV['TEASPOON_RAILS_ENV'] = File.expand_path('../test/dummy/config/environment', __FILE__)
102
+ task teaspoon: 'app:teaspoon'
103
+
104
+ desc 'Start a server at http://localhost:3000/teaspoon for JavaScript tests'
105
+ task :teaspoon_server do
106
+ Dir.chdir("test/dummy")
107
+ teaspoon_env = File.expand_path('../test/teaspoon_env.rb', __FILE__)
108
+ system "RAILS_ENV=test TEASPOON_ENV=#{teaspoon_env} rails s"
109
+ end
@@ -0,0 +1,236 @@
1
+ /**
2
+ * @author Jeremie Ges <jges@weblinc.com>
3
+ */
4
+ (function($) {
5
+
6
+ function Magnify() {
7
+
8
+ /**
9
+ * DOM accessors
10
+ * @type {Object}
11
+ */
12
+ this.$dom = {
13
+ container: null,
14
+ image: null
15
+ },
16
+
17
+ /**
18
+ * Keep track of things
19
+ * @type {Object}
20
+ */
21
+ this.flags = {
22
+ imageLoaded: false,
23
+ },
24
+
25
+ /**
26
+ * Contains every options of $.fn.magnify.defaults
27
+ * merged with the options provided by the user
28
+ * @type {Object}
29
+ */
30
+ this.options = {},
31
+
32
+ /**
33
+ * Initialize the widget with the right options,
34
+ * scope (container) and boot
35
+ * @param {HTMLElement} container - The container of the zoom element
36
+ * @param {Object} options - The options provided by the user
37
+ */
38
+ this.init = function(container, options) {
39
+ this.$dom.container = $(container);
40
+ this.options = _.extend($.fn.magnify.defaults, options);
41
+ this.setup();
42
+ this.events();
43
+ },
44
+
45
+ /**
46
+ * Setup minimal dependencies
47
+ */
48
+ this.setup = function() {
49
+ this.setupImage();
50
+ },
51
+
52
+ /**
53
+ * Create a blank <img> tag which
54
+ * will be used as the zoom image.
55
+ */
56
+ this.setupImage = function() {
57
+ this.$dom.image = $('<img/>');
58
+ },
59
+
60
+ /**
61
+ * Attach events and start listen
62
+ */
63
+ this.events = function() {
64
+ this.$dom.image.on('load', this.onLoadImage.bind(this));
65
+
66
+ this.$dom.container
67
+ .on('mouseenter', this.onEnterContainer.bind(this))
68
+ .on('mouseleave', this.onLeaveContainer.bind(this))
69
+ .on('mousemove', this.onMoveContainer.bind(this));
70
+
71
+ if (this.options.touchSupport) {
72
+ this.$dom.container
73
+ .on('touchstart', this.onEnterContainer.bind(this))
74
+ .on('touchend', this.onLeaveContainer.bind(this))
75
+ .on('touchmove', this.onMoveContainer.bind(this));
76
+ }
77
+
78
+ this.$dom.container.on('magnify.destroy', this.destroy.bind(this));
79
+ },
80
+
81
+ /**
82
+ * Callback when the zoom image is loaded
83
+ */
84
+ this.onLoadImage = function() {
85
+ // Insert zoom image in page
86
+ this.$dom.image
87
+ .css({
88
+ position: 'absolute',
89
+ top: 0,
90
+ left: 0,
91
+ width: this.$dom.image.get(0).width,
92
+ height: this.$dom.image.get(0).height,
93
+ border: 'none',
94
+ maxWidth: 'none',
95
+ maxHeight: 'none',
96
+ })
97
+ .attr('role', 'presentation')
98
+ .appendTo(this.$dom.container);
99
+
100
+ this.$dom.container.css('overflow', 'hidden');
101
+ this.flags.imageLoaded = true;
102
+ },
103
+
104
+ /**
105
+ * Callback when the mouse / finger enters inside
106
+ * the container
107
+ */
108
+ this.onEnterContainer = function(e) {
109
+ e.preventDefault();
110
+
111
+ if (!this.flags.imageLoaded) {
112
+ this.loadImage();
113
+ }
114
+
115
+ this.showImage();
116
+ },
117
+
118
+ /**
119
+ * Callback when the mouse / finger leaves
120
+ * the container
121
+ */
122
+ this.onLeaveContainer = function(e) {
123
+ e.preventDefault();
124
+ this.hideImage();
125
+ },
126
+
127
+ /**
128
+ * Callback when the mouse / finger is moving
129
+ * in the container
130
+ */
131
+ this.onMoveContainer = function(e) {
132
+ e.preventDefault();
133
+ this.refreshPositionImage(e);
134
+ },
135
+
136
+ /**
137
+ * Depending the current position of the mouse / finger,
138
+ * moves the properties top/left of the zoom image.
139
+ */
140
+ this.refreshPositionImage = function(e) {
141
+ var pageX = e.pageX || e.originalEvent.pageX,
142
+ pageY = e.pageY || e.originalEvent.pageY,
143
+ containerOffset = this.$dom.container.offset(),
144
+ containerWidth = this.$dom.container.outerWidth(),
145
+ containerHeight = this.$dom.container.outerHeight(),
146
+ xRatio = (this.$dom.image.prop('width') - containerWidth) / containerWidth,
147
+ yRatio = (this.$dom.image.prop('height') - containerHeight) / containerHeight,
148
+ top = (pageY - containerOffset.top),
149
+ left = (pageX - containerOffset.left);
150
+
151
+ top = Math.max(Math.min(top, containerHeight), 0);
152
+ left = Math.max(Math.min(left, containerWidth), 0);
153
+
154
+ this.$dom.image.css({
155
+ top: (top * -yRatio) + 'px',
156
+ left: (left * -xRatio) + 'px'
157
+ });
158
+ },
159
+
160
+ /**
161
+ * Add the attribute src of the zoom image,
162
+ * therefore it triggers the load of the zoom
163
+ * image.
164
+ */
165
+ this.loadImage = function() {
166
+ this.$dom.image.attr('src', this.getUrlImage());
167
+ },
168
+
169
+ /**
170
+ * Hide the zoom image
171
+ */
172
+ this.hideImage = function() {
173
+ this.$dom.image.css('opacity', 0);
174
+ },
175
+
176
+ /**
177
+ * Show the zoom image
178
+ */
179
+ this.showImage = function() {
180
+ this.$dom.image.css('opacity', 1);
181
+ },
182
+
183
+ /**
184
+ * Get the src url of the zoom image
185
+ */
186
+ this.getUrlImage = function() {
187
+ if (!_.isEmpty(this.options.url)) {
188
+ return this.options.url;
189
+ }
190
+
191
+ return this.$dom.container.data('magnify-src');
192
+ },
193
+
194
+ /**
195
+ * Teardown the changes
196
+ */
197
+ this.destroy = function() {
198
+ this.$dom.container.off('mouseenter mouseleave mousemove magnify.destroy');
199
+ this.$dom.image.off('load');
200
+ this.$dom.image.remove();
201
+ this.$dom.container.css('overflow', '');
202
+ }
203
+ }
204
+
205
+ /**
206
+ * Public jQuery API
207
+ */
208
+
209
+ $.fn.magnify = function(options) {
210
+
211
+ var options = options || {};
212
+
213
+ return this.each(function() {
214
+ new Magnify().init(this, options);
215
+ });
216
+ };
217
+
218
+ $.fn.magnify.defaults = {
219
+
220
+ /**
221
+ * The url of the zoom image.
222
+ * If not specified, the plugin will look for the data attribute
223
+ * data-magnify-src on the thumbnail <img>.
224
+ * @type {String}
225
+ */
226
+ url: null,
227
+
228
+ /**
229
+ * Do you want to enable finger gestures on
230
+ * touch-enabled devices?
231
+ * @type {Boolean}
232
+ */
233
+ touchSupport: false
234
+ };
235
+
236
+ })(window.jQuery);