j1m_scroll 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (101) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.md +21 -0
  3. data/README.md +41 -0
  4. data/_data/modules/default/j1_scroll-0.0.1/j1_back2top.yml +131 -0
  5. data/_data/modules/default/j1_scroll-0.0.1/j1_smooth_scroll.yml +162 -0
  6. data/_data/resources/default/j1_scroll-0.0.1/resource.yml +43 -0
  7. data/assets/themes/j1/iframe_resizer/.npmignore +9 -0
  8. data/assets/themes/j1/iframe_resizer/.travis.yml +6 -0
  9. data/assets/themes/j1/iframe_resizer/CONTRIBUTING.md +86 -0
  10. data/assets/themes/j1/iframe_resizer/Iframe-resizer by davidjbradshaw.url +2 -0
  11. data/assets/themes/j1/iframe_resizer/LICENSE +21 -0
  12. data/assets/themes/j1/iframe_resizer/README.md +608 -0
  13. data/assets/themes/j1/iframe_resizer/bower.json +45 -0
  14. data/assets/themes/j1/iframe_resizer/example/frame.absolute.html +88 -0
  15. data/assets/themes/j1/iframe_resizer/example/frame.content.html +58 -0
  16. data/assets/themes/j1/iframe_resizer/example/frame.hover.html +51 -0
  17. data/assets/themes/j1/iframe_resizer/example/frame.nested.html +72 -0
  18. data/assets/themes/j1/iframe_resizer/example/frame.textarea.html +46 -0
  19. data/assets/themes/j1/iframe_resizer/example/frame.tolerance.html +79 -0
  20. data/assets/themes/j1/iframe_resizer/example/index.html +70 -0
  21. data/assets/themes/j1/iframe_resizer/example/two.html +71 -0
  22. data/assets/themes/j1/iframe_resizer/gruntfile.js +215 -0
  23. data/assets/themes/j1/iframe_resizer/iframeResizer.jquery.json +41 -0
  24. data/assets/themes/j1/iframe_resizer/index.js +4 -0
  25. data/assets/themes/j1/iframe_resizer/js/_client.js +1131 -0
  26. data/assets/themes/j1/iframe_resizer/js/_server.js +1126 -0
  27. data/assets/themes/j1/iframe_resizer/js/ie8.polyfils.js +85 -0
  28. data/assets/themes/j1/iframe_resizer/js/ie8.polyfils.map +1 -0
  29. data/assets/themes/j1/iframe_resizer/js/ie8.polyfils.min.js +4 -0
  30. data/assets/themes/j1/iframe_resizer/js/iframeResizer.contentWindow.js +1104 -0
  31. data/assets/themes/j1/iframe_resizer/js/iframeResizer.contentWindow.map +1 -0
  32. data/assets/themes/j1/iframe_resizer/js/iframeResizer.contentWindow.min.js +10 -0
  33. data/assets/themes/j1/iframe_resizer/js/iframeResizer.js +1007 -0
  34. data/assets/themes/j1/iframe_resizer/js/iframeResizer.js.modified +1004 -0
  35. data/assets/themes/j1/iframe_resizer/js/iframeResizer.map +1 -0
  36. data/assets/themes/j1/iframe_resizer/js/iframeResizer.min.js +9 -0
  37. data/assets/themes/j1/iframe_resizer/js/index.js +2 -0
  38. data/assets/themes/j1/iframe_resizer/karma.conf.js +92 -0
  39. data/assets/themes/j1/iframe_resizer/package.json +111 -0
  40. data/assets/themes/j1/iframe_resizer/spec/_initSpec.js +63 -0
  41. data/assets/themes/j1/iframe_resizer/spec/anchorSpec.js +62 -0
  42. data/assets/themes/j1/iframe_resizer/spec/childSpec.js +403 -0
  43. data/assets/themes/j1/iframe_resizer/spec/closeSpecSpec.js +44 -0
  44. data/assets/themes/j1/iframe_resizer/spec/getPageInfoSpec.js +32 -0
  45. data/assets/themes/j1/iframe_resizer/spec/initCssSpec.js +28 -0
  46. data/assets/themes/j1/iframe_resizer/spec/initDomSpec.js +27 -0
  47. data/assets/themes/j1/iframe_resizer/spec/initDoubleCallSpec.js +33 -0
  48. data/assets/themes/j1/iframe_resizer/spec/initErrorSpec.js +57 -0
  49. data/assets/themes/j1/iframe_resizer/spec/initJQuerySpec.js +29 -0
  50. data/assets/themes/j1/iframe_resizer/spec/initUndefinedDomSpec.js +25 -0
  51. data/assets/themes/j1/iframe_resizer/spec/javascripts/fixtures/iframe.html +2 -0
  52. data/assets/themes/j1/iframe_resizer/spec/javascripts/fixtures/iframe600.html +4 -0
  53. data/assets/themes/j1/iframe_resizer/spec/javascripts/fixtures/iframe600WithId.html +4 -0
  54. data/assets/themes/j1/iframe_resizer/spec/lib/common.js +59 -0
  55. data/assets/themes/j1/iframe_resizer/spec/parentSpec.js +88 -0
  56. data/assets/themes/j1/iframe_resizer/spec/resources/djb.jpg +0 -0
  57. data/assets/themes/j1/iframe_resizer/spec/resources/frame.content.html +176 -0
  58. data/assets/themes/j1/iframe_resizer/spec/resources/frame.lateload.html +33 -0
  59. data/assets/themes/j1/iframe_resizer/spec/resources/frame.nested.html +40 -0
  60. data/assets/themes/j1/iframe_resizer/spec/scrollSpec.js +53 -0
  61. data/assets/themes/j1/iframe_resizer/spec/sendMessageSpec.js +58 -0
  62. data/assets/themes/j1/iframe_resizer/spec/support/jasmine.json +9 -0
  63. data/assets/themes/j1/iframe_resizer/src/ie8.polyfils.js +64 -0
  64. data/assets/themes/j1/iframe_resizer/src/iframeResizer.contentWindow.js +1123 -0
  65. data/assets/themes/j1/iframe_resizer/src/iframeResizer.js +1002 -0
  66. data/assets/themes/j1/iframe_resizer/test-main.js +33 -0
  67. data/assets/themes/j1/iframe_resizer/test/_init.html +44 -0
  68. data/assets/themes/j1/iframe_resizer/test/_init_once.html +45 -0
  69. data/assets/themes/j1/iframe_resizer/test/_init_once_async.html +72 -0
  70. data/assets/themes/j1/iframe_resizer/test/background.html +47 -0
  71. data/assets/themes/j1/iframe_resizer/test/changePage.html +50 -0
  72. data/assets/themes/j1/iframe_resizer/test/close.html +44 -0
  73. data/assets/themes/j1/iframe_resizer/test/getId.html +44 -0
  74. data/assets/themes/j1/iframe_resizer/test/interval.html +56 -0
  75. data/assets/themes/j1/iframe_resizer/test/jqueryNoConflict.html +47 -0
  76. data/assets/themes/j1/iframe_resizer/test/lateImageLoad.html +90 -0
  77. data/assets/themes/j1/iframe_resizer/test/margin.html +73 -0
  78. data/assets/themes/j1/iframe_resizer/test/mutationObserver.html +63 -0
  79. data/assets/themes/j1/iframe_resizer/test/nested.html +46 -0
  80. data/assets/themes/j1/iframe_resizer/test/resize.contentWidth.html +51 -0
  81. data/assets/themes/j1/iframe_resizer/test/resize.width.html +63 -0
  82. data/assets/themes/j1/iframe_resizer/test/resources/djb.jpg +0 -0
  83. data/assets/themes/j1/iframe_resizer/test/resources/frame.content.html +191 -0
  84. data/assets/themes/j1/iframe_resizer/test/resources/frame.lateload.html +33 -0
  85. data/assets/themes/j1/iframe_resizer/test/resources/frame.nested.html +40 -0
  86. data/assets/themes/j1/iframe_resizer/test/resources/jquery.js +6 -0
  87. data/assets/themes/j1/iframe_resizer/test/resources/qunit.css +244 -0
  88. data/assets/themes/j1/iframe_resizer/test/resources/qunit.js +2212 -0
  89. data/assets/themes/j1/iframe_resizer/test/resources/require.js +2103 -0
  90. data/assets/themes/j1/iframe_resizer/test/resources/testLib.js +9 -0
  91. data/assets/themes/j1/iframe_resizer/test/scrolling.html +65 -0
  92. data/assets/themes/j1/iframe_resizer/test/sendMessage.html +61 -0
  93. data/assets/themes/j1/iframe_resizer/test/setHeightCalculationMethod.html +51 -0
  94. data/assets/themes/j1/iframe_resizer/test/size.html +64 -0
  95. data/assets/themes/j1/iframe_resizer/test/v1.html +189 -0
  96. data/assets/themes/j1/j1/js/adapters/iframe_resizer.js +105 -0
  97. data/exe/console +14 -0
  98. data/exe/setup +8 -0
  99. data/lib/j1m_scroll.rb +5 -0
  100. data/lib/j1m_scroll/version.rb +3 -0
  101. metadata +190 -0
@@ -0,0 +1,70 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>iFrame message passing test</title>
6
+ <meta name="description" content="iFrame message passing test">
7
+ <meta name="viewport" content="width=device-width">
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
+ </head>
10
+ <body>
11
+ <h2>Automagically resizing iFrame</h2>
12
+ <p>Resize window or click one of the links in the iFrame to watch it resize. Or try with <a name="anchorParentTest" href="two.html">two iFrames</a>.</p>
13
+ <div style="margin:20px;">
14
+ <iframe src="frame.content.html" width="100%" scrolling="no"></iframe>
15
+ </div>
16
+ <p id="callback">
17
+ </p>
18
+ <div style="margin: 8px 0;font-size:13px;">
19
+ For details on how this works, see
20
+ <a href="http://davidjbradshaw.github.io/iframe-resizer/">http://davidjbradshaw.github.io/iframe-resizer/</a>.
21
+ </div>
22
+
23
+ <!-- MDN PolyFils for IE8 (This is not normally needed if you use the jQuery version) -->
24
+ <!--[if lte IE 8]>
25
+ <script type="text/javascript" src="../js/ie8.polyfils.min.js"></script>
26
+ <![endif]-->
27
+
28
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
29
+ <script type="text/javascript" src="../js/iframeResizer.min.js"></script>
30
+ <script type="text/javascript">
31
+
32
+ /*
33
+ * If you do not understand what the code below does, then please just use the
34
+ * following call in your own code.
35
+ *
36
+ * iFrameResize({log:true});
37
+ *
38
+ * Once you have it working, set the log option to false.
39
+ */
40
+
41
+ iFrameResize({
42
+ log : true, // Enable console logging
43
+ inPageLinks : true,
44
+ resizedCallback : function(messageData){ // Callback fn when resize is received
45
+ $('p#callback').html(
46
+ '<b>Frame ID:</b> ' + messageData.iframe.id +
47
+ ' <b>Height:</b> ' + messageData.height +
48
+ ' <b>Width:</b> ' + messageData.width +
49
+ ' <b>Event type:</b> ' + messageData.type
50
+ );
51
+ },
52
+ messageCallback : function(messageData){ // Callback fn when message is received
53
+ $('p#callback').html(
54
+ '<b>Frame ID:</b> ' + messageData.iframe.id +
55
+ ' <b>Message:</b> ' + messageData.message
56
+ );
57
+ alert(messageData.message);
58
+ document.getElementsByTagName('iframe')[0].iFrameResizer.sendMessage('Hello back from parent page');
59
+ },
60
+ closedCallback : function(id){ // Callback fn when iFrame is closed
61
+ $('p#callback').html(
62
+ '<b>IFrame (</b>' + id +
63
+ '<b>) removed from page.</b>'
64
+ );
65
+ }
66
+ });
67
+
68
+ </script>
69
+ </body>
70
+ </html>
@@ -0,0 +1,71 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>iFrame message passing test</title>
6
+ <meta name="description" content="iFrame message passing test">
7
+ <meta name="viewport" content="width=device-width">
8
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
9
+ </head>
10
+ <body>
11
+ <h2>Automagically resizing iFrame</h2>
12
+ <p>Resize window or click one of the links in the iFrame to watch it resize. Or go back to a <a name="anchorParentTest" href="index.html">single iFrame</a>.</p>
13
+ <div style="margin:20px;">
14
+ <iframe src="frame.content.html" width="48%" scrolling="no" style="float:left;margin-right:2%"></iframe>
15
+ <iframe src="frame.content.html" width="48%" scrolling="no"></iframe>
16
+ </div>
17
+ <p id="callback">
18
+ </p>
19
+ <div style="margin: 8px 0;font-size:13px;">
20
+ For details on how this works, see
21
+ <a href="http://davidjbradshaw.github.io/iframe-resizer/">http://davidjbradshaw.github.io/iframe-resizer/</a>.
22
+ </div>
23
+
24
+ <!-- MDN PolyFils for IE8 -->
25
+ <!--[if lte IE 8]>
26
+ <script type="text/javascript" src="../js/ie8.polyfils.min.js"></script>
27
+ <![endif]-->
28
+
29
+ <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
30
+ <script type="text/javascript" src="../src/iframeResizer.js"></script>
31
+ <script type="text/javascript">
32
+
33
+ /*
34
+ * If you do not understand what the code below does, then please just use the
35
+ * following call in your own code.
36
+ *
37
+ * iFrameResize({log:true});
38
+ *
39
+ * Once you have it working, set the log option to false.
40
+ */
41
+
42
+ iFrameResize({
43
+ log : true, // Enable console logging
44
+ enablePublicMethods : true, // Enable methods within iframe hosted page
45
+ enableInPageLinks : true,
46
+ resizedCallback : function(messageData){ // Callback fn when resize is received
47
+ $('p#callback').html(
48
+ '<b>Frame ID:</b> ' + messageData.iframe.id +
49
+ ' <b>Height:</b> ' + messageData.height +
50
+ ' <b>Width:</b> ' + messageData.width +
51
+ ' <b>Event type:</b> ' + messageData.type
52
+ );
53
+ },
54
+ messageCallback : function(messageData){ // Callback fn when message is received
55
+ $('p#callback').html(
56
+ '<b>Frame ID:</b> ' + messageData.iframe.id +
57
+ ' <b>Message:</b> ' + messageData.message
58
+ );
59
+ alert(messageData.message + ' (' + messageData.iframe.id + ')' );
60
+ },
61
+ closedCallback : function(id){ // Callback fn when iFrame is closed
62
+ $('p#callback').html(
63
+ '<b>IFrame (</b>' + id +
64
+ '<b>) removed from page.</b>'
65
+ );
66
+ }
67
+ });
68
+
69
+ </script>
70
+ </body>
71
+ </html>
@@ -0,0 +1,215 @@
1
+ /*global module:false*/
2
+ module.exports = function(grunt) {
3
+
4
+ 'Use strict';
5
+
6
+ // show elapsed time at the end
7
+ require('time-grunt')(grunt);
8
+
9
+ // load all grunt tasks
10
+ //require('load-grunt-tasks')(grunt);
11
+ require('jit-grunt')(grunt,{
12
+ 'bump-only':'grunt-bump',
13
+ 'bump-commit':'grunt-bump',
14
+ 'coveralls':'grunt-karma-coveralls'
15
+ });
16
+
17
+ // Project configuration.
18
+ grunt.initConfig({
19
+ pkg: grunt.file.readJSON('package.json'),
20
+
21
+ meta: {
22
+ bannerLocal: '/*! iFrame Resizer (iframeSizer.min.js ) - v<%= pkg.version %> - ' +
23
+ '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
24
+ ' * Desc: Force cross domain iframes to size to content.\n' +
25
+ ' * Requires: iframeResizer.contentWindow.min.js to be loaded into the target frame.\n' +
26
+ ' * Copyright: (c) <%= grunt.template.today("yyyy") %> David J. Bradshaw - dave@bradshaw.net\n' +
27
+ ' * License: MIT\n */\n',
28
+ bannerRemote: '/*! iFrame Resizer (iframeSizer.contentWindow.min.js) - v<%= pkg.version %> - ' +
29
+ '<%= grunt.template.today("yyyy-mm-dd") %>\n' +
30
+ ' * Desc: Include this file in any page being loaded into an iframe\n' +
31
+ ' * to force the iframe to resize to the content size.\n' +
32
+ ' * Requires: iframeResizer.min.js on host page.\n' +
33
+ ' * Copyright: (c) <%= grunt.template.today("yyyy") %> David J. Bradshaw - dave@bradshaw.net\n' +
34
+ ' * License: MIT\n */\n'
35
+ },
36
+
37
+ clean: ['coverage', 'coverageLcov'],
38
+
39
+ qunit: {
40
+ files: ['test/*.html']
41
+ },
42
+
43
+ karma: {
44
+ options: {
45
+ configFile: 'karma.conf.js'
46
+ },
47
+ travis:{
48
+ singleRun: true,
49
+ browsers: ['PhantomJS'],
50
+ coverageReporter: {
51
+ type : 'lcov',
52
+ dir : 'coverageLcov/'
53
+ },
54
+ },
55
+ single:{
56
+ singleRun: true,
57
+ browsers: ['Chrome', 'Firefox', 'PhantomJS'] // 'Safari' ,
58
+ }
59
+ },
60
+
61
+ coveralls: {
62
+ options: {
63
+ debug: true,
64
+ coverageDir: 'coverageLcov',
65
+ dryRun: false,
66
+ force: true,
67
+ recursive: true
68
+ }
69
+ },
70
+
71
+ jshint: {
72
+ options: {
73
+ globals: {
74
+ jQuery:false,
75
+ require:true,
76
+ process:true
77
+ },
78
+ },
79
+ gruntfile: {
80
+ src: 'gruntfile.js'
81
+ },
82
+ code: {
83
+ src: 'src/**/*.js'
84
+ },
85
+ },
86
+
87
+ uglify: {
88
+ options: {
89
+ sourceMap:true,
90
+ sourceMapIncludeSources:true,
91
+ report:'gzip',
92
+ },
93
+ local: {
94
+ options:{
95
+ banner:'<%= meta.bannerLocal %>',
96
+ sourceMapName: 'js/iframeResizer.map'
97
+ },
98
+ src: ['js/iframeResizer.js'],
99
+ dest: 'js/iframeResizer.min.js',
100
+ },
101
+ remote: {
102
+ options: {
103
+ banner:'<%= meta.bannerRemote %>',
104
+ sourceMapName: 'js/iframeResizer.contentWindow.map'
105
+ },
106
+ src: ['js/iframeResizer.contentWindow.js'],
107
+ dest: 'js/iframeResizer.contentWindow.min.js',
108
+ },
109
+ polyfil: {
110
+ options: {
111
+ banner:'// IE8 polyfils for iframeResizer.js\n',
112
+ sourceMapName: 'js/ie8.polyfils.map'
113
+ },
114
+ src: ['src/ie8.polyfils.js'],
115
+ dest: 'js/ie8.polyfils.min.js',
116
+ }
117
+ },
118
+
119
+ watch: {
120
+ files: ['src/**/*'],
121
+ tasks: 'default'
122
+ },
123
+
124
+ bump: {
125
+ options: {
126
+ files: ['package.json','bower.json','iframeResizer.jquery.json'],
127
+ updateConfigs: ['pkg'],
128
+ commit: true,
129
+ commitMessage: 'Release v%VERSION%',
130
+ commitFiles: ['-a'], // '-a' for all files
131
+ createTag: true,
132
+ tagName: 'v%VERSION%',
133
+ tagMessage: 'Version %VERSION%',
134
+ push: true,
135
+ pushTo: 'origin',
136
+ gitDescribeOptions: '--tags --always --abbrev=1 --dirty=-d' // options to use with '$ git describe'
137
+ }
138
+ },
139
+
140
+ shell: {
141
+ options:{
142
+ stdout: true,
143
+ stderr: true,
144
+ failOnError: true
145
+ },
146
+ npm:{
147
+ command: 'npm publish'
148
+ },
149
+ deployExample: {
150
+ command: function(){
151
+
152
+ var
153
+ retStr = '',
154
+ fs = require('fs');
155
+
156
+ if (fs.existsSync('bin')) {
157
+ retStr = 'bin/deploy.sh';
158
+ }
159
+
160
+ return retStr;
161
+ }
162
+ }
163
+ },
164
+
165
+ jsonlint: {
166
+ json: {
167
+ src: [ '*.json' ]
168
+ }
169
+ },
170
+
171
+ removeBlock: {
172
+ options : ["TEST CODE START", 'TEST CODE END'],
173
+ files : [
174
+ {src : 'src/iframeResizer.contentWindow.js', dest : 'js/iframeResizer.contentWindow.js'}
175
+ ]
176
+ },
177
+
178
+ copy: {
179
+ main: {
180
+ nonull: true,
181
+ src: 'src/iframeResizer.js',
182
+ dest: 'js/iframeResizer.js',
183
+ },
184
+ },
185
+
186
+ });
187
+
188
+ grunt.registerTask('default', ['notest','karma:single']);
189
+ grunt.registerTask('build', ['removeBlock','copy','uglify']);
190
+ grunt.registerTask('notest', ['jsonlint','jshint','build']);
191
+ grunt.registerTask('test', ['clean','jshint','qunit','karma:single']);
192
+ grunt.registerTask('travis', ['clean','notest','qunit','karma:travis','coveralls']);
193
+
194
+ grunt.registerTask('postBump',['build','bump-commit','shell']);
195
+ grunt.registerTask('preBump', ['clean','notest','qunit']);
196
+ grunt.registerTask('patch', ['preBump','bump-only:patch','postBump']);
197
+ grunt.registerTask('minor', ['preBump','bump-only:minor','postBump']);
198
+ grunt.registerTask('major', ['preBump','bump-only:major','postBump']);
199
+
200
+ grunt.registerMultiTask('removeBlock', function() {
201
+
202
+ // set up a removal regular expression
203
+ var removalRegEx = new RegExp('(\/\/ ' + this.options()[0] + ' \/\/)(?:[^])*?(\/\/ ' + this.options()[1] + ' \/\/)', 'g');
204
+
205
+ this.data.forEach(function(fileObj){
206
+
207
+ var sourceFile = grunt.file.read( fileObj.src ),
208
+ removedFile = sourceFile.replace( removalRegEx, '' ),
209
+ targetFile = grunt.file.write( fileObj.dest, removedFile );
210
+
211
+ });// for each loop end
212
+
213
+ });
214
+
215
+ };
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "iframeResizer",
3
+ "title": "Iframe Resizer",
4
+ "description": "Responsively keep same and cross domain iFrames sized to their content with support for window/content resizing, multiple and nested iFrames. (Works with IE8+)",
5
+ "keywords": [
6
+ "Cross-Domain",
7
+ "iFrame",
8
+ "Resizing",
9
+ "Resizer",
10
+ "postMessage",
11
+ "content",
12
+ "height",
13
+ "autoheight",
14
+ "auto-height",
15
+ "width",
16
+ "mutationObserver",
17
+ "RWD",
18
+ "responsive"
19
+ ],
20
+ "version": "3.5.5",
21
+ "author": {
22
+ "name": "David J. Bradshaw",
23
+ "email": "davidjbradshaw+github@gmail.com"
24
+ },
25
+ "maintainers": [{
26
+ "name": "David J. Bradshaw",
27
+ "email": "davidjbradshaw+github@gmail.com"
28
+ }
29
+ ],
30
+ "licenses": [{
31
+ "type": "MIT",
32
+ "url": "https://github.com/jquery/jquery-color/blob/2.1.2/MIT-LICENSE.txt"
33
+ }
34
+ ],
35
+ "bugs": "https://github.com/davidjbradshaw/iframe-resizer/issues",
36
+ "homepage": "http://davidjbradshaw.github.io/iframe-resizer/",
37
+ "docs": "https://github.com/davidjbradshaw/iframe-resizer",
38
+ "dependencies": {
39
+ "jquery": ">=1.0"
40
+ }
41
+ }
@@ -0,0 +1,4 @@
1
+
2
+ 'use strict';
3
+
4
+ module.exports = require('./js');
@@ -0,0 +1,1131 @@
1
+ /*
2
+ # -----------------------------------------------------------------------------
3
+ # J1: ~/assets/themes/j1/application-manager/js/client.js
4
+ # Modified JavaScript based on iframeResizer version 3.5.5.
5
+ #
6
+ # J1 Application Manager allows to include dynamic HTML pages, applications
7
+ # sites using iframes for J1. The client component needs to be placed in the
8
+ # page/application that should be contained within the iFrame. This file is
9
+ # designed to be a guest/client on someone else's system. The client has no
10
+ # dependencies and won't do anything until it's activated by a message from
11
+ # the containing page.
12
+ #
13
+ # Product/Info:
14
+ # http://jekyll.one
15
+ # https://github.com/davidjbradshaw/iframe-resizer
16
+ #
17
+ # Copyright (C) 2013-2016 David J. Bradshaw
18
+ # Copyright (C) 2016 Juergen Adams
19
+ #
20
+ # iframeResizer: Licensed under Open Source Iniative MIT.
21
+ # For details, see http://opensource.org/licenses/MIT
22
+ # J1: Licensed under the Creative Commons Attribution 3.0 Unported License.
23
+ # For details, see http://creativecommons.org/licenses/by/3.0/.
24
+ #
25
+ # -----------------------------------------------------------------------------
26
+ # Note: Include this file in any page being loaded into an iframe
27
+ # to force the iframe to resize to the content size.
28
+ #
29
+ # -----------------------------------------------------------------------------
30
+ # $LastChangedDate: 2016-12-04 19:37:21 +0100 (So, 04 Dez 2016) $
31
+ # $LastChangedRevision: 13 $
32
+ # $LastChangedBy: jadams $
33
+ # -----------------------------------------------------------------------------
34
+ */
35
+
36
+ ;(function(window, undefined) {
37
+ 'use strict';
38
+
39
+ var
40
+ autoResize = true,
41
+ base = 10,
42
+ bodyBackground = '',
43
+ bodyMargin = 0,
44
+ bodyMarginStr = '',
45
+ bodyObserver = null,
46
+ bodyPadding = '',
47
+ calculateWidth = false,
48
+ doubleEventList = {'resize':1,'click':1},
49
+ eventCancelTimer = 128,
50
+ firstRun = true,
51
+ height = 1,
52
+ heightCalcModeDefault = 'bodyOffset',
53
+ heightCalcMode = heightCalcModeDefault,
54
+ initLock = true,
55
+ initMsg = '',
56
+ inPageLinks = {},
57
+ interval = 32,
58
+ intervalTimer = null,
59
+ logging = false,
60
+ msgID = '[iFrameSizer]', //Must match host page msg ID
61
+ msgIdLen = msgID.length,
62
+ myID = '',
63
+ observer = null,
64
+ resetRequiredMethods = {max:1,min:1,bodyScroll:1,documentElementScroll:1},
65
+ resizeFrom = 'child',
66
+ sendPermit = true,
67
+ target = window.parent,
68
+ targetOriginDefault = '*',
69
+ tolerance = 0,
70
+ triggerLocked = false,
71
+ triggerLockedTimer = null,
72
+ throttledTimer = 16,
73
+ width = 1,
74
+ widthCalcModeDefault = 'scroll',
75
+ widthCalcMode = widthCalcModeDefault,
76
+ win = window,
77
+ messageCallback = function(){ warn('MessageCallback function not defined'); },
78
+ readyCallback = function(){},
79
+ pageInfoCallback = function(){},
80
+ customCalcMethods = {
81
+ height: function(){
82
+ warn('Custom height calculation function not defined');
83
+ return document.documentElement.offsetHeight;
84
+ },
85
+ width: function(){
86
+ warn('Custom width calculation function not defined');
87
+ return document.body.scrollWidth;
88
+ }
89
+ };
90
+
91
+
92
+ function addEventListener(el,evt,func){
93
+ /* istanbul ignore else */ // Not testable in phantonJS
94
+ if ('addEventListener' in window){
95
+ el.addEventListener(evt,func, false);
96
+ } else if ('attachEvent' in window){ //IE
97
+ el.attachEvent('on'+evt,func);
98
+ }
99
+ }
100
+
101
+ function removeEventListener(el,evt,func){
102
+ /* istanbul ignore else */ // Not testable in phantonJS
103
+ if ('removeEventListener' in window){
104
+ el.removeEventListener(evt,func, false);
105
+ } else if ('detachEvent' in window){ //IE
106
+ el.detachEvent('on'+evt,func);
107
+ }
108
+ }
109
+
110
+ function capitalizeFirstLetter(string) {
111
+ return string.charAt(0).toUpperCase() + string.slice(1);
112
+ }
113
+
114
+ //Based on underscore.js
115
+ function throttle(func) {
116
+ var
117
+ context, args, result,
118
+ timeout = null,
119
+ previous = 0,
120
+ later = function() {
121
+ previous = getNow();
122
+ timeout = null;
123
+ result = func.apply(context, args);
124
+ if (!timeout) {
125
+ context = args = null;
126
+ }
127
+ };
128
+
129
+ return function() {
130
+ var now = getNow();
131
+
132
+ if (!previous) {
133
+ previous = now;
134
+ }
135
+
136
+ var remaining = throttledTimer - (now - previous);
137
+
138
+ context = this;
139
+ args = arguments;
140
+
141
+ if (remaining <= 0 || remaining > throttledTimer) {
142
+ if (timeout) {
143
+ clearTimeout(timeout);
144
+ timeout = null;
145
+ }
146
+
147
+ previous = now;
148
+ result = func.apply(context, args);
149
+
150
+ if (!timeout) {
151
+ context = args = null;
152
+ }
153
+
154
+ } else if (!timeout) {
155
+ timeout = setTimeout(later, remaining);
156
+ }
157
+
158
+ return result;
159
+ };
160
+ }
161
+
162
+ var getNow = Date.now || function() {
163
+ /* istanbul ignore next */ // Not testable in PhantonJS
164
+ return new Date().getTime();
165
+ };
166
+
167
+ function formatLogMsg(msg){
168
+ return msgID + '[' + myID + ']' + ' ' + msg;
169
+ }
170
+
171
+ function log(msg){
172
+ if (logging && ('object' === typeof window.console)){
173
+ console.log(formatLogMsg(msg));
174
+ }
175
+ }
176
+
177
+ function warn(msg){
178
+ if ('object' === typeof window.console){
179
+ console.warn(formatLogMsg(msg));
180
+ }
181
+ }
182
+
183
+
184
+ function init(){
185
+ readDataFromParent();
186
+ log('Initialising iFrame ('+location.href+')');
187
+ readDataFromPage();
188
+ setMargin();
189
+ setBodyStyle('background',bodyBackground);
190
+ setBodyStyle('padding',bodyPadding);
191
+ injectClearFixIntoBodyElement();
192
+ checkHeightMode();
193
+ checkWidthMode();
194
+ stopInfiniteResizingOfIFrame();
195
+ setupPublicMethods();
196
+ startEventListeners();
197
+ inPageLinks = setupInPageLinks();
198
+ sendSize('init','Init message from host page');
199
+ readyCallback();
200
+ }
201
+
202
+ function readDataFromParent(){
203
+
204
+ function strBool(str){
205
+ return 'true' === str ? true : false;
206
+ }
207
+
208
+ var data = initMsg.substr(msgIdLen).split(':');
209
+
210
+ myID = data[0];
211
+ bodyMargin = (undefined !== data[1]) ? Number(data[1]) : bodyMargin; //For V1 compatibility
212
+ calculateWidth = (undefined !== data[2]) ? strBool(data[2]) : calculateWidth;
213
+ logging = (undefined !== data[3]) ? strBool(data[3]) : logging;
214
+ interval = (undefined !== data[4]) ? Number(data[4]) : interval;
215
+ autoResize = (undefined !== data[6]) ? strBool(data[6]) : autoResize;
216
+ bodyMarginStr = data[7];
217
+ heightCalcMode = (undefined !== data[8]) ? data[8] : heightCalcMode;
218
+ bodyBackground = data[9];
219
+ bodyPadding = data[10];
220
+ tolerance = (undefined !== data[11]) ? Number(data[11]) : tolerance;
221
+ inPageLinks.enable = (undefined !== data[12]) ? strBool(data[12]): false;
222
+ resizeFrom = (undefined !== data[13]) ? data[13] : resizeFrom;
223
+ widthCalcMode = (undefined !== data[14]) ? data[14] : widthCalcMode;
224
+ }
225
+
226
+ function readDataFromPage(){
227
+ function readData(){
228
+ var data = window.iFrameResizer;
229
+
230
+ log('Reading data from page: ' + JSON.stringify(data));
231
+
232
+ messageCallback = ('messageCallback' in data) ? data.messageCallback : messageCallback;
233
+ readyCallback = ('readyCallback' in data) ? data.readyCallback : readyCallback;
234
+ targetOriginDefault = ('targetOrigin' in data) ? data.targetOrigin : targetOriginDefault;
235
+ heightCalcMode = ('heightCalculationMethod' in data) ? data.heightCalculationMethod : heightCalcMode;
236
+ widthCalcMode = ('widthCalculationMethod' in data) ? data.widthCalculationMethod : widthCalcMode;
237
+ }
238
+
239
+ function setupCustomCalcMethods(calcMode, calcFunc){
240
+ if ('function' === typeof calcMode) {
241
+ log('Setup custom ' + calcFunc + 'CalcMethod');
242
+ customCalcMethods[calcFunc] = calcMode;
243
+ calcMode = 'custom';
244
+ }
245
+
246
+ return calcMode;
247
+ }
248
+
249
+ if(('iFrameResizer' in window) && (Object === window.iFrameResizer.constructor)) {
250
+ readData();
251
+ heightCalcMode = setupCustomCalcMethods(heightCalcMode, 'height');
252
+ widthCalcMode = setupCustomCalcMethods(widthCalcMode, 'width');
253
+ }
254
+
255
+ log('TargetOrigin for parent set to: ' + targetOriginDefault);
256
+ }
257
+
258
+
259
+ function chkCSS(attr,value){
260
+ if (-1 !== value.indexOf('-')){
261
+ warn('Negative CSS value ignored for '+attr);
262
+ value='';
263
+ }
264
+ return value;
265
+ }
266
+
267
+ function setBodyStyle(attr,value){
268
+ if ((undefined !== value) && ('' !== value) && ('null' !== value)){
269
+ document.body.style[attr] = value;
270
+ log('Body '+attr+' set to "'+value+'"');
271
+ }
272
+ }
273
+
274
+ function setMargin(){
275
+ //If called via V1 script, convert bodyMargin from int to str
276
+ if (undefined === bodyMarginStr){
277
+ bodyMarginStr = bodyMargin+'px';
278
+ }
279
+
280
+ setBodyStyle('margin',chkCSS('margin',bodyMarginStr));
281
+ }
282
+
283
+ function stopInfiniteResizingOfIFrame(){
284
+ document.documentElement.style.height = '';
285
+ document.body.style.height = '';
286
+ log('HTML & body height set to "auto"');
287
+ }
288
+
289
+
290
+ function manageTriggerEvent(options){
291
+ function handleEvent(){
292
+ sendSize(options.eventName,options.eventType);
293
+ }
294
+
295
+ var listener = {
296
+ add: function(eventName){
297
+ addEventListener(window,eventName,handleEvent);
298
+ },
299
+ remove: function(eventName){
300
+ removeEventListener(window,eventName,handleEvent);
301
+ }
302
+ };
303
+
304
+ if(options.eventNames && Array.prototype.map){
305
+ options.eventName = options.eventNames[0];
306
+ options.eventNames.map(listener[options.method]);
307
+ } else {
308
+ listener[options.method](options.eventName);
309
+ }
310
+
311
+ log(capitalizeFirstLetter(options.method) + ' event listener: ' + options.eventType);
312
+ }
313
+
314
+ function manageEventListeners(method){
315
+ manageTriggerEvent({method:method, eventType: 'Animation Start', eventNames: ['animationstart','webkitAnimationStart'] });
316
+ manageTriggerEvent({method:method, eventType: 'Animation Iteration', eventNames: ['animationiteration','webkitAnimationIteration'] });
317
+ manageTriggerEvent({method:method, eventType: 'Animation End', eventNames: ['animationend','webkitAnimationEnd'] });
318
+ manageTriggerEvent({method:method, eventType: 'Input', eventName: 'input' });
319
+ manageTriggerEvent({method:method, eventType: 'Mouse Up', eventName: 'mouseup' });
320
+ manageTriggerEvent({method:method, eventType: 'Mouse Down', eventName: 'mousedown' });
321
+ manageTriggerEvent({method:method, eventType: 'Orientation Change', eventName: 'orientationchange' });
322
+ manageTriggerEvent({method:method, eventType: 'Print', eventName: ['afterprint', 'beforeprint'] });
323
+ manageTriggerEvent({method:method, eventType: 'Ready State Change', eventName: 'readystatechange' });
324
+ manageTriggerEvent({method:method, eventType: 'Touch Start', eventName: 'touchstart' });
325
+ manageTriggerEvent({method:method, eventType: 'Touch End', eventName: 'touchend' });
326
+ manageTriggerEvent({method:method, eventType: 'Touch Cancel', eventName: 'touchcancel' });
327
+ manageTriggerEvent({method:method, eventType: 'Transition Start', eventNames: ['transitionstart','webkitTransitionStart','MSTransitionStart','oTransitionStart','otransitionstart'] });
328
+ manageTriggerEvent({method:method, eventType: 'Transition Iteration', eventNames: ['transitioniteration','webkitTransitionIteration','MSTransitionIteration','oTransitionIteration','otransitioniteration'] });
329
+ manageTriggerEvent({method:method, eventType: 'Transition End', eventNames: ['transitionend','webkitTransitionEnd','MSTransitionEnd','oTransitionEnd','otransitionend'] });
330
+ if('child' === resizeFrom){
331
+ manageTriggerEvent({method:method, eventType: 'IFrame Resized', eventName: 'resize' });
332
+ }
333
+ }
334
+
335
+ function checkCalcMode(calcMode,calcModeDefault,modes,type){
336
+ if (calcModeDefault !== calcMode){
337
+ if (!(calcMode in modes)){
338
+ warn(calcMode + ' is not a valid option for '+type+'CalculationMethod.');
339
+ calcMode=calcModeDefault;
340
+ }
341
+ log(type+' calculation method set to "'+calcMode+'"');
342
+ }
343
+
344
+ return calcMode;
345
+ }
346
+
347
+ function checkHeightMode(){
348
+ heightCalcMode = checkCalcMode(heightCalcMode,heightCalcModeDefault,getHeight,'height');
349
+ }
350
+
351
+ function checkWidthMode(){
352
+ widthCalcMode = checkCalcMode(widthCalcMode,widthCalcModeDefault,getWidth,'width');
353
+ }
354
+
355
+ function startEventListeners(){
356
+ if ( true === autoResize ) {
357
+ manageEventListeners('add');
358
+ setupMutationObserver();
359
+ }
360
+ else {
361
+ log('Auto Resize disabled');
362
+ }
363
+ }
364
+
365
+ function stopMsgsToParent(){
366
+ log('Disable outgoing messages');
367
+ sendPermit = false;
368
+ }
369
+
370
+ function removeMsgListener(){
371
+ log('Remove event listener: Message');
372
+ removeEventListener(window, 'message', receiver);
373
+ }
374
+
375
+ function disconnectMutationObserver(){
376
+ if (null !== bodyObserver){
377
+ /* istanbul ignore next */ // Not testable in PhantonJS
378
+ bodyObserver.disconnect();
379
+ }
380
+ }
381
+
382
+ function stopEventListeners(){
383
+ manageEventListeners('remove');
384
+ disconnectMutationObserver();
385
+ clearInterval(intervalTimer);
386
+ }
387
+
388
+ function teardown(){
389
+ stopMsgsToParent();
390
+ removeMsgListener();
391
+ if (true === autoResize) stopEventListeners();
392
+ }
393
+
394
+ function injectClearFixIntoBodyElement(){
395
+ var clearFix = document.createElement('div');
396
+ clearFix.style.clear = 'both';
397
+ clearFix.style.display = 'block'; //Guard against this having been globally redefined in CSS.
398
+ document.body.appendChild(clearFix);
399
+ }
400
+
401
+ function setupInPageLinks(){
402
+
403
+ function getPagePosition (){
404
+ return {
405
+ x: (window.pageXOffset !== undefined) ? window.pageXOffset : document.documentElement.scrollLeft,
406
+ y: (window.pageYOffset !== undefined) ? window.pageYOffset : document.documentElement.scrollTop
407
+ };
408
+ }
409
+
410
+ function getElementPosition(el){
411
+ var
412
+ elPosition = el.getBoundingClientRect(),
413
+ pagePosition = getPagePosition();
414
+
415
+ return {
416
+ x: parseInt(elPosition.left,10) + parseInt(pagePosition.x,10),
417
+ y: parseInt(elPosition.top,10) + parseInt(pagePosition.y,10)
418
+ };
419
+ }
420
+
421
+ function findTarget(location){
422
+ function jumpToTarget(target){
423
+ var jumpPosition = getElementPosition(target);
424
+
425
+ log('Moving to in page link (#'+hash+') at x: '+jumpPosition.x+' y: '+jumpPosition.y);
426
+ sendMsg(jumpPosition.y, jumpPosition.x, 'scrollToOffset'); // X&Y reversed at sendMsg uses height/width
427
+ }
428
+
429
+ var
430
+ hash = location.split('#')[1] || location, //Remove # if present
431
+ hashData = decodeURIComponent(hash),
432
+ target = document.getElementById(hashData) || document.getElementsByName(hashData)[0];
433
+
434
+ if (undefined !== target){
435
+ jumpToTarget(target);
436
+ } else {
437
+ log('In page link (#' + hash + ') not found in iFrame, so sending to parent');
438
+ sendMsg(0,0,'inPageLink','#'+hash);
439
+ }
440
+ }
441
+
442
+ function checkLocationHash(){
443
+ if ('' !== location.hash && '#' !== location.hash){
444
+ findTarget(location.href);
445
+ }
446
+ }
447
+
448
+ function bindAnchors(){
449
+ function setupLink(el){
450
+ function linkClicked(e){
451
+ e.preventDefault();
452
+
453
+ /*jshint validthis:true */
454
+ findTarget(this.getAttribute('href'));
455
+ }
456
+
457
+ if ('#' !== el.getAttribute('href')){
458
+ addEventListener(el,'click',linkClicked);
459
+ }
460
+ }
461
+
462
+ Array.prototype.forEach.call( document.querySelectorAll( 'a[href^="#"]' ), setupLink );
463
+ }
464
+
465
+ function bindLocationHash(){
466
+ addEventListener(window,'hashchange',checkLocationHash);
467
+ }
468
+
469
+ function initCheck(){ //check if page loaded with location hash after init resize
470
+ setTimeout(checkLocationHash,eventCancelTimer);
471
+ }
472
+
473
+ function enableInPageLinks(){
474
+ /* istanbul ignore else */ // Not testable in phantonJS
475
+ if(Array.prototype.forEach && document.querySelectorAll){
476
+ log('Setting up location.hash handlers');
477
+ bindAnchors();
478
+ bindLocationHash();
479
+ initCheck();
480
+ } else {
481
+ warn('In page linking not fully supported in this browser! (See README.md for IE8 workaround)');
482
+ }
483
+ }
484
+
485
+ if(inPageLinks.enable){
486
+ enableInPageLinks();
487
+ } else {
488
+ log('In page linking not enabled');
489
+ }
490
+
491
+ return {
492
+ findTarget:findTarget
493
+ };
494
+ }
495
+
496
+ function setupPublicMethods(){
497
+ log('Enable public methods');
498
+
499
+ win.parentIFrame = {
500
+
501
+ autoResize: function autoResizeF(resize){
502
+ if (true === resize && false === autoResize) {
503
+ autoResize=true;
504
+ startEventListeners();
505
+ //sendSize('autoResize','Auto Resize enabled');
506
+ } else if (false === resize && true === autoResize) {
507
+ autoResize=false;
508
+ stopEventListeners();
509
+ }
510
+
511
+ return autoResize;
512
+ },
513
+
514
+ close: function closeF(){
515
+ sendMsg(0,0,'close');
516
+ teardown();
517
+ },
518
+
519
+ getId: function getIdF(){
520
+ return myID;
521
+ },
522
+
523
+ getPageInfo: function getPageInfoF(callback){
524
+ if ('function' === typeof callback){
525
+ pageInfoCallback = callback;
526
+ sendMsg(0,0,'pageInfo');
527
+ } else {
528
+ pageInfoCallback = function(){};
529
+ sendMsg(0,0,'pageInfoStop');
530
+ }
531
+ },
532
+
533
+ moveToAnchor: function moveToAnchorF(hash){
534
+ inPageLinks.findTarget(hash);
535
+ },
536
+
537
+ reset: function resetF(){
538
+ resetIFrame('parentIFrame.reset');
539
+ },
540
+
541
+ scrollTo: function scrollToF(x,y){
542
+ sendMsg(y,x,'scrollTo'); // X&Y reversed at sendMsg uses height/width
543
+ },
544
+
545
+ scrollToOffset: function scrollToF(x,y){
546
+ sendMsg(y,x,'scrollToOffset'); // X&Y reversed at sendMsg uses height/width
547
+ },
548
+
549
+ sendMessage: function sendMessageF(msg,targetOrigin){
550
+ sendMsg(0,0,'message',JSON.stringify(msg),targetOrigin);
551
+ },
552
+
553
+ setHeightCalculationMethod: function setHeightCalculationMethodF(heightCalculationMethod){
554
+ heightCalcMode = heightCalculationMethod;
555
+ checkHeightMode();
556
+ },
557
+
558
+ setWidthCalculationMethod: function setWidthCalculationMethodF(widthCalculationMethod){
559
+ widthCalcMode = widthCalculationMethod;
560
+ checkWidthMode();
561
+ },
562
+
563
+ setTargetOrigin: function setTargetOriginF(targetOrigin){
564
+ log('Set targetOrigin: '+targetOrigin);
565
+ targetOriginDefault = targetOrigin;
566
+ },
567
+
568
+ size: function sizeF(customHeight, customWidth){
569
+ var valString = ''+(customHeight?customHeight:'')+(customWidth?','+customWidth:'');
570
+ //lockTrigger();
571
+ sendSize('size','parentIFrame.size('+valString+')', customHeight, customWidth);
572
+ }
573
+ };
574
+ }
575
+
576
+ function initInterval(){
577
+ if ( 0 !== interval ){
578
+ log('setInterval: '+interval+'ms');
579
+ intervalTimer = setInterval(function(){
580
+ sendSize('interval','setInterval: '+interval);
581
+ },Math.abs(interval));
582
+ }
583
+ }
584
+
585
+ /* istanbul ignore next */ //Not testable in PhantomJS
586
+ function setupBodyMutationObserver(){
587
+ function addImageLoadListners(mutation) {
588
+ function addImageLoadListener(element){
589
+ if (false === element.complete) {
590
+ log('Attach listeners to ' + element.src);
591
+ element.addEventListener('load', imageLoaded, false);
592
+ element.addEventListener('error', imageError, false);
593
+ elements.push(element);
594
+ }
595
+ }
596
+
597
+ if (mutation.type === 'attributes' && mutation.attributeName === 'src'){
598
+ addImageLoadListener(mutation.target);
599
+ } else if (mutation.type === 'childList'){
600
+ Array.prototype.forEach.call(
601
+ mutation.target.querySelectorAll('img'),
602
+ addImageLoadListener
603
+ );
604
+ }
605
+ }
606
+
607
+ function removeFromArray(element){
608
+ elements.splice(elements.indexOf(element),1);
609
+ }
610
+
611
+ function removeImageLoadListener(element){
612
+ log('Remove listeners from ' + element.src);
613
+ element.removeEventListener('load', imageLoaded, false);
614
+ element.removeEventListener('error', imageError, false);
615
+ removeFromArray(element);
616
+ }
617
+
618
+ function imageEventTriggered(event,type,typeDesc){
619
+ removeImageLoadListener(event.target);
620
+ sendSize(type, typeDesc + ': ' + event.target.src, undefined, undefined);
621
+ }
622
+
623
+ function imageLoaded(event) {
624
+ imageEventTriggered(event,'imageLoad','Image loaded');
625
+ }
626
+
627
+ function imageError(event) {
628
+ imageEventTriggered(event,'imageLoadFailed','Image load failed');
629
+ }
630
+
631
+ function mutationObserved(mutations) {
632
+ sendSize('mutationObserver','mutationObserver: ' + mutations[0].target + ' ' + mutations[0].type);
633
+
634
+ //Deal with WebKit asyncing image loading when tags are injected into the page
635
+ mutations.forEach(addImageLoadListners);
636
+ }
637
+
638
+ function createMutationObserver(){
639
+ var
640
+ target = document.querySelector('body'),
641
+
642
+ config = {
643
+ attributes : true,
644
+ attributeOldValue : false,
645
+ characterData : true,
646
+ characterDataOldValue : false,
647
+ childList : true,
648
+ subtree : true
649
+ };
650
+
651
+ observer = new MutationObserver(mutationObserved);
652
+
653
+ log('Create body MutationObserver');
654
+ observer.observe(target, config);
655
+
656
+ return observer;
657
+ }
658
+
659
+ var
660
+ elements = [],
661
+ MutationObserver = window.MutationObserver || window.WebKitMutationObserver,
662
+ observer = createMutationObserver();
663
+
664
+ return {
665
+ disconnect: function (){
666
+ if ('disconnect' in observer){
667
+ log('Disconnect body MutationObserver');
668
+ observer.disconnect();
669
+ elements.forEach(removeImageLoadListener);
670
+ }
671
+ }
672
+ };
673
+ }
674
+
675
+ function setupMutationObserver(){
676
+ var forceIntervalTimer = 0 > interval;
677
+
678
+ /* istanbul ignore if */ // Not testable in PhantomJS
679
+ if (window.MutationObserver || window.WebKitMutationObserver){
680
+ if (forceIntervalTimer) {
681
+ initInterval();
682
+ } else {
683
+ bodyObserver = setupBodyMutationObserver();
684
+ }
685
+ } else {
686
+ log('MutationObserver not supported in this browser!');
687
+ initInterval();
688
+ }
689
+ }
690
+
691
+
692
+ // document.documentElement.offsetHeight is not reliable, so
693
+ // we have to jump through hoops to get a better value.
694
+ function getComputedStyle(prop,el) {
695
+ /* istanbul ignore next */ //Not testable in PhantomJS
696
+ function convertUnitsToPxForIE8(value) {
697
+ var PIXEL = /^\d+(px)?$/i;
698
+
699
+ if (PIXEL.test(value)) {
700
+ return parseInt(value,base);
701
+ }
702
+
703
+ var
704
+ style = el.style.left,
705
+ runtimeStyle = el.runtimeStyle.left;
706
+
707
+ el.runtimeStyle.left = el.currentStyle.left;
708
+ el.style.left = value || 0;
709
+ value = el.style.pixelLeft;
710
+ el.style.left = style;
711
+ el.runtimeStyle.left = runtimeStyle;
712
+
713
+ return value;
714
+ }
715
+
716
+ var retVal = 0;
717
+ el = el || document.body;
718
+
719
+ /* istanbul ignore else */ // Not testable in phantonJS
720
+ if (('defaultView' in document) && ('getComputedStyle' in document.defaultView)) {
721
+ retVal = document.defaultView.getComputedStyle(el, null);
722
+ retVal = (null !== retVal) ? retVal[prop] : 0;
723
+ } else {//IE8
724
+ retVal = convertUnitsToPxForIE8(el.currentStyle[prop]);
725
+ }
726
+
727
+ return parseInt(retVal,base);
728
+ }
729
+
730
+ function chkEventThottle(timer){
731
+ if(timer > throttledTimer/2){
732
+ throttledTimer = 2*timer;
733
+ log('Event throttle increased to ' + throttledTimer + 'ms');
734
+ }
735
+ }
736
+
737
+ //Idea from https://github.com/guardian/iframe-messenger
738
+ function getMaxElement(side,elements) {
739
+ var
740
+ elementsLength = elements.length,
741
+ elVal = 0,
742
+ maxVal = 0,
743
+ Side = capitalizeFirstLetter(side),
744
+ timer = getNow();
745
+
746
+ for (var i = 0; i < elementsLength; i++) {
747
+ elVal = elements[i].getBoundingClientRect()[side] + getComputedStyle('margin'+Side,elements[i]);
748
+ if (elVal > maxVal) {
749
+ maxVal = elVal;
750
+ }
751
+ }
752
+
753
+ timer = getNow() - timer;
754
+
755
+ log('Parsed '+elementsLength+' HTML elements');
756
+ log('Element position calculated in ' + timer + 'ms');
757
+
758
+ chkEventThottle(timer);
759
+
760
+ return maxVal;
761
+ }
762
+
763
+ function getAllMeasurements(dimention){
764
+ return [
765
+ dimention.bodyOffset(),
766
+ dimention.bodyScroll(),
767
+ dimention.documentElementOffset(),
768
+ dimention.documentElementScroll()
769
+ ];
770
+ }
771
+
772
+ function getTaggedElements(side,tag){
773
+ function noTaggedElementsFound(){
774
+ warn('No tagged elements ('+tag+') found on page');
775
+ return height; //current height
776
+ }
777
+
778
+ var elements = document.querySelectorAll('['+tag+']');
779
+
780
+ return 0 === elements.length ? noTaggedElementsFound() : getMaxElement(side,elements);
781
+ }
782
+
783
+ function getAllElements(){
784
+ return document.querySelectorAll('body *');
785
+ }
786
+
787
+ var
788
+ getHeight = {
789
+ bodyOffset: function getBodyOffsetHeight(){
790
+ return document.body.offsetHeight + getComputedStyle('marginTop') + getComputedStyle('marginBottom');
791
+ },
792
+
793
+ offset: function(){
794
+ return getHeight.bodyOffset(); //Backwards compatability
795
+ },
796
+
797
+ bodyScroll: function getBodyScrollHeight(){
798
+ return document.body.scrollHeight;
799
+ },
800
+
801
+ custom: function getCustomWidth(){
802
+ return customCalcMethods.height();
803
+ },
804
+
805
+ documentElementOffset: function getDEOffsetHeight(){
806
+ return document.documentElement.offsetHeight;
807
+ },
808
+
809
+ documentElementScroll: function getDEScrollHeight(){
810
+ return document.documentElement.scrollHeight;
811
+ },
812
+
813
+ max: function getMaxHeight(){
814
+ return Math.max.apply(null,getAllMeasurements(getHeight));
815
+ },
816
+
817
+ min: function getMinHeight(){
818
+ return Math.min.apply(null,getAllMeasurements(getHeight));
819
+ },
820
+
821
+ grow: function growHeight(){
822
+ return getHeight.max(); //Run max without the forced downsizing
823
+ },
824
+
825
+ lowestElement: function getBestHeight(){
826
+ return Math.max(getHeight.bodyOffset(), getMaxElement('bottom',getAllElements()));
827
+ },
828
+
829
+ taggedElement: function getTaggedElementsHeight(){
830
+ return getTaggedElements('bottom','data-iframe-height');
831
+ }
832
+ },
833
+
834
+ getWidth = {
835
+ bodyScroll: function getBodyScrollWidth(){
836
+ return document.body.scrollWidth;
837
+ },
838
+
839
+ bodyOffset: function getBodyOffsetWidth(){
840
+ return document.body.offsetWidth;
841
+ },
842
+
843
+ custom: function getCustomWidth(){
844
+ return customCalcMethods.width();
845
+ },
846
+
847
+ documentElementScroll: function getDEScrollWidth(){
848
+ return document.documentElement.scrollWidth;
849
+ },
850
+
851
+ documentElementOffset: function getDEOffsetWidth(){
852
+ return document.documentElement.offsetWidth;
853
+ },
854
+
855
+ scroll: function getMaxWidth(){
856
+ return Math.max(getWidth.bodyScroll(), getWidth.documentElementScroll());
857
+ },
858
+
859
+ max: function getMaxWidth(){
860
+ return Math.max.apply(null,getAllMeasurements(getWidth));
861
+ },
862
+
863
+ min: function getMinWidth(){
864
+ return Math.min.apply(null,getAllMeasurements(getWidth));
865
+ },
866
+
867
+ rightMostElement: function rightMostElement(){
868
+ return getMaxElement('right', getAllElements());
869
+ },
870
+
871
+ taggedElement: function getTaggedElementsWidth(){
872
+ return getTaggedElements('right', 'data-iframe-width');
873
+ }
874
+ };
875
+
876
+
877
+ function sizeIFrame(triggerEvent, triggerEventDesc, customHeight, customWidth){
878
+
879
+ function resizeIFrame(){
880
+ height = currentHeight;
881
+ width = currentWidth;
882
+
883
+ sendMsg(height,width,triggerEvent);
884
+ }
885
+
886
+ function isSizeChangeDetected(){
887
+ function checkTolarance(a,b){
888
+ var retVal = Math.abs(a-b) <= tolerance;
889
+ return !retVal;
890
+ }
891
+
892
+ currentHeight = (undefined !== customHeight) ? customHeight : getHeight[heightCalcMode]();
893
+ currentWidth = (undefined !== customWidth ) ? customWidth : getWidth[widthCalcMode]();
894
+
895
+ return checkTolarance(height,currentHeight) || (calculateWidth && checkTolarance(width,currentWidth));
896
+ }
897
+
898
+ function isForceResizableEvent(){
899
+ return !(triggerEvent in {'init':1,'interval':1,'size':1});
900
+ }
901
+
902
+ function isForceResizableCalcMode(){
903
+ return (heightCalcMode in resetRequiredMethods) || (calculateWidth && widthCalcMode in resetRequiredMethods);
904
+ }
905
+
906
+ function logIgnored(){
907
+ log('No change in size detected');
908
+ }
909
+
910
+ function checkDownSizing(){
911
+ if (isForceResizableEvent() && isForceResizableCalcMode()){
912
+ resetIFrame(triggerEventDesc);
913
+ } else if (!(triggerEvent in {'interval':1})){
914
+ logIgnored();
915
+ }
916
+ }
917
+
918
+ var currentHeight,currentWidth;
919
+
920
+ if (isSizeChangeDetected() || 'init' === triggerEvent){
921
+ lockTrigger();
922
+ resizeIFrame();
923
+ } else {
924
+ checkDownSizing();
925
+ }
926
+ }
927
+
928
+ var sizeIFrameThrottled = throttle(sizeIFrame);
929
+
930
+ function sendSize(triggerEvent, triggerEventDesc, customHeight, customWidth){
931
+ function recordTrigger(){
932
+ if (!(triggerEvent in {'reset':1,'resetPage':1,'init':1})){
933
+ log( 'Trigger event: ' + triggerEventDesc );
934
+ }
935
+ }
936
+
937
+ function isDoubleFiredEvent(){
938
+ return triggerLocked && (triggerEvent in doubleEventList);
939
+ }
940
+
941
+ if (!isDoubleFiredEvent()){
942
+ recordTrigger();
943
+ sizeIFrameThrottled(triggerEvent, triggerEventDesc, customHeight, customWidth);
944
+ } else {
945
+ log('Trigger event cancelled: '+triggerEvent);
946
+ }
947
+ }
948
+
949
+ function lockTrigger(){
950
+ if (!triggerLocked){
951
+ triggerLocked = true;
952
+ log('Trigger event lock on');
953
+ }
954
+ clearTimeout(triggerLockedTimer);
955
+ triggerLockedTimer = setTimeout(function(){
956
+ triggerLocked = false;
957
+ log('Trigger event lock off');
958
+ log('--');
959
+ },eventCancelTimer);
960
+ }
961
+
962
+ function triggerReset(triggerEvent){
963
+ height = getHeight[heightCalcMode]();
964
+ width = getWidth[widthCalcMode]();
965
+
966
+ sendMsg(height,width,triggerEvent);
967
+ }
968
+
969
+ function resetIFrame(triggerEventDesc){
970
+ var hcm = heightCalcMode;
971
+ heightCalcMode = heightCalcModeDefault;
972
+
973
+ log('Reset trigger event: ' + triggerEventDesc);
974
+ lockTrigger();
975
+ triggerReset('reset');
976
+
977
+ heightCalcMode = hcm;
978
+ }
979
+
980
+ function sendMsg(height,width,triggerEvent,msg,targetOrigin){
981
+ function setTargetOrigin(){
982
+ if (undefined === targetOrigin){
983
+ targetOrigin = targetOriginDefault;
984
+ } else {
985
+ log('Message targetOrigin: '+targetOrigin);
986
+ }
987
+ }
988
+
989
+ function sendToParent(){
990
+ var
991
+ size = height + ':' + width,
992
+ message = myID + ':' + size + ':' + triggerEvent + (undefined !== msg ? ':' + msg : '');
993
+
994
+ log('Sending message to host page (' + message + ')');
995
+ target.postMessage( msgID + message, targetOrigin);
996
+ }
997
+
998
+ if(true === sendPermit){
999
+ setTargetOrigin();
1000
+ sendToParent();
1001
+ }
1002
+ }
1003
+
1004
+ function receiver(event) {
1005
+ function isMessageForUs(){
1006
+ return msgID === (''+event.data).substr(0,msgIdLen); //''+ Protects against non-string messages
1007
+ }
1008
+
1009
+ function initFromParent(){
1010
+ function fireInit(){
1011
+ initMsg = event.data;
1012
+ target = event.source;
1013
+
1014
+ init();
1015
+ firstRun = false;
1016
+ setTimeout(function(){ initLock = false;},eventCancelTimer);
1017
+ }
1018
+
1019
+ if (document.body){
1020
+ fireInit();
1021
+ } else {
1022
+ log('Waiting for page ready');
1023
+ addEventListener(window,'readystatechange',initFromParent);
1024
+ }
1025
+ }
1026
+
1027
+ function resetFromParent(){
1028
+ if (!initLock){
1029
+ log('Page size reset by host page');
1030
+ triggerReset('resetPage');
1031
+ } else {
1032
+ log('Page reset ignored by init');
1033
+ }
1034
+ }
1035
+
1036
+ function resizeFromParent(){
1037
+ sendSize('resizeParent','Parent window requested size check');
1038
+ }
1039
+
1040
+ function moveToAnchor(){
1041
+ var anchor = getData();
1042
+ inPageLinks.findTarget(anchor);
1043
+ }
1044
+
1045
+ function getMessageType(){
1046
+ return event.data.split(']')[1].split(':')[0];
1047
+ }
1048
+
1049
+ function getData(){
1050
+ return event.data.substr(event.data.indexOf(':')+1);
1051
+ }
1052
+
1053
+ function isMiddleTier(){
1054
+ return ('iFrameResize' in window);
1055
+ }
1056
+
1057
+ function messageFromParent(){
1058
+ var msgBody = getData();
1059
+
1060
+ log('MessageCallback called from parent: ' + msgBody );
1061
+ messageCallback(JSON.parse(msgBody));
1062
+ log(' --');
1063
+ }
1064
+
1065
+ function pageInfoFromParent(){
1066
+ var msgBody = getData();
1067
+ log('PageInfoFromParent called from parent: ' + msgBody );
1068
+ pageInfoCallback(JSON.parse(msgBody));
1069
+ log(' --');
1070
+ }
1071
+
1072
+ function isInitMsg(){
1073
+ //Test if this message is from a child below us. This is an ugly test, however, updating
1074
+ //the message format would break backwards compatibity.
1075
+ return event.data.split(':')[2] in {'true':1,'false':1};
1076
+ }
1077
+
1078
+ function callFromParent(){
1079
+ switch (getMessageType()){
1080
+ case 'reset':
1081
+ resetFromParent();
1082
+ break;
1083
+ case 'resize':
1084
+ resizeFromParent();
1085
+ break;
1086
+ case 'inPageLink':
1087
+ case 'moveToAnchor':
1088
+ moveToAnchor();
1089
+ break;
1090
+ case 'message':
1091
+ messageFromParent();
1092
+ break;
1093
+ case 'pageInfo':
1094
+ pageInfoFromParent();
1095
+ break;
1096
+ default:
1097
+ if (!isMiddleTier() && !isInitMsg()){
1098
+ warn('Unexpected message ('+event.data+')');
1099
+ }
1100
+ }
1101
+ }
1102
+
1103
+ function processMessage(){
1104
+ if (false === firstRun) {
1105
+ callFromParent();
1106
+ } else if (isInitMsg()) {
1107
+ initFromParent();
1108
+ } else {
1109
+ log('Ignored message of type "' + getMessageType() + '". Received before initialization.');
1110
+ }
1111
+ }
1112
+
1113
+ if (isMessageForUs()){
1114
+ processMessage();
1115
+ }
1116
+ }
1117
+
1118
+ //Normally the parent kicks things off when it detects the iFrame has loaded.
1119
+ //If this script is async-loaded, then tell parent page to retry init.
1120
+ function chkLateLoaded(){
1121
+ if('loading' !== document.readyState){
1122
+ window.parent.postMessage('[iFrameResizerChild]Ready','*');
1123
+ }
1124
+ }
1125
+
1126
+ addEventListener(window, 'message', receiver);
1127
+ chkLateLoaded();
1128
+
1129
+
1130
+
1131
+ })(window || {});