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